我在Java接口上定义的 getHandler
方法的实现失败了,我不知道为什么 . 这是方法签名:
<H extends EventHandler> H getHandler( Type<H> type, int index );
我在Scala中的实现是:
def getHandler[H <: com.google.gwt.event.shared.EventHandler]
(aType: Type[H], index: Int): H
= new com.google.gwt.event.shared.EventHandler() {}
...但是编译器给了我这样的信息:
type mismatch;
found: java.lang.Object with com.google.gwt.event.shared.EventHandler
required: H
我哪里错了?
3 回答
我想这可能会使它编译:
它期待
H
. 正如Lachlan所说,某些地方可能需要aType
.我认为's because your implementation doesn' t维护界面的 Contract .
H
可以是EventHandler
的任何子类型,由aType
参数的类型决定 . 但是,无论传递什么作为aType
参数,您的实现始终返回相同的匿名子类型EventHandler
.我不知道如何在不以某种方式使用
aType
参数的情况下实现这一点 .添加到Lachlan's answer我想指出,简单地将返回类型转换为预期类型可能会产生灾难性后果 .
考虑以下实现,其中我使用了一个命名类而不是问题中的匿名内部类:
以下行将导致
ClassCastException
没有警告 .因此除了强制转换之外,实现还必须确保返回的处理程序实际上可以赋值给H或返回
null
或抛出异常 .