Реализация метода интерфейса Java в Scala - PullRequest
2 голосов
/ 01 сентября 2010

Моя реализация метода getHandler, определенного в интерфейсе Java, не удалась, и я не знаю почему.Вот подпись метода:

<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 ]

4 голосов
/ 01 сентября 2010

Я думаю, это потому, что ваша реализация не поддерживает контракт интерфейса.H может быть любым подтипом EventHandler, определяемым типом аргумента aType.Но ваша реализация всегда возвращает один и тот же анонимный подтип EventHandler, независимо от того, что передается в качестве аргумента aType.

Я не знаю, какой будет правильная реализация, но я не вижукак это можно реализовать без использования параметра aType.

3 голосов
/ 01 сентября 2010

Добавление к Ответ Лахлана Я хотел бы отметить, что простое приведение типа возврата к ожидаемому типу может иметь катастрофические последствия.

Рассмотрим следующую реализацию, в которой я использовал именованный класс вместо анонимного внутреннего класса из вопроса:

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, либо выдать исключение.

1 голос
/ 01 сентября 2010

Я думаю, что это может сделать компиляцию:

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. Как говорит Лахлан, aType, вероятно, где-то нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...