首页 文章

在Scala中实现Java接口方法

提问于
浏览
2

我在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 回答

  • 3

    我想这可能会使它编译:

    def getHandler[H <: com.google.gwt.event.shared.EventHandler]
        (aType: Type[H], index: Int): H = {
      val h = new com.google.gwt.event.shared.EventHandler() {}
      h.asInstanceOf[H]
    }
    

    它期待 H . 正如Lachlan所说,某些地方可能需要 aType .

  • 1

    我认为's because your implementation doesn' t维护界面的 Contract . H 可以是 EventHandler 的任何子类型,由 aType 参数的类型决定 . 但是,无论传递什么作为 aType 参数,您的实现始终返回相同的匿名子类型 EventHandler .

    我不知道如何在不以某种方式使用 aType 参数的情况下实现这一点 .

  • 4

    添加到Lachlan's answer我想指出,简单地将返回类型转换为预期类型可能会产生灾难性后果 .

    考虑以下实现,其中我使用了一个命名类而不是问题中的匿名内部类:

    class MyHandlerA extends EventHandler
    class MyHandlerB extends EventHandler
    
    object BadImplementation extends I {
      def getHandler[H <: EventHandler](typ : Type[H], index: Int) = {
        (new MyHandlerA).asInstanceOf[H] // BAD: This asInstanceOf is a lie!
      }
    }
    

    以下行将导致 ClassCastException 没有警告 .

    val b: MyHandlerB = BadImplementation.getHandler(new Type[MyHandlerB] {} , 0)
    

    因此除了强制转换之外,实现还必须确保返回的处理程序实际上可以赋值给H或返回 null 或抛出异常 .

相关问题