abstract class Handler {
type Message
def handleAny(msg: Any) {
if (msg.isInstanceOf[Message]) handle(msg.asInstanceOf[Message]) // fix me!
}
def handle(msg: Message)
}
class StringHandler extends Handler {
override type Message = String
def handle(msg: Message) { println(s"handling: $msg") }
}
val h = new StringHandler
h.handleAny("ahoj")
h.handleAny(true)
warning: abstract type Handler.this.Message is unchecked since it is
eliminated by erasure
if(msg.isInstanceOf[Message]) handle(msg.asInstanceOf[Message])
^
one warning found
handling: ahoj
java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
at Main$$anon$1$StringHandler.handle(typeProblem.scala:11)
at Main$$anon$1$Handler.handleAny(typeProblem.scala:5)
Как изменить фрагмент (без изменения интерфейса или замены поле типа с параметром типа), чтобы работать, как и ожидалось, что обрабатывать только те сообщения, заданных опциями тип поля?Стирание полей типа
Я ищу решение, которое может быть применено к родительскому абстрактному классу, а не загрязнению всех детей.
Я также попытался использовать match
, и он ведет себя точно так же. Или это невозможно сделать с полями типа (я думал, что они более мощные, чем параметры типа)?