Добавление к Ответ Лахлана Я хотел бы отметить, что простое приведение типа возврата к ожидаемому типу может иметь катастрофические последствия.
Рассмотрим следующую реализацию, в которой я использовал именованный класс вместо анонимного внутреннего класса из вопроса:
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
, либо выдать исключение.