Załóżmy, że mamy rodzajowe klasy Container
:Jak dopasować wzór na typowy w Scali?
case class Container[+A](value: A)
Następnie chcesz wzór dopasować Container
z Double
i Container
z Any
:
val double = Container(3.3)
var container: Container[Any] = double
Aby to zrobić, będziemy normalnie pisać :
container match {
case c: Container[String] => println(c.value.toUpperCase)
case c: Container[Double] => println(math.sqrt(c.value))
case _ => println("_")
}
Jednak kompilator podaje dwa ostrzeżenia , po jednym dla każdego z pierwszych dwóch przypadków. Na przykład pierwsze ostrzeżenie mówi: "argument typu nie zmiennego Łańcuch w wzorzec typu Kontener [Ciąg] nie jest zaznaczony, ponieważ został usunięty przez wymazanie". Ze względu na wymazanie w czasie wykonywania nie jest możliwe rozróżnienie między różnymi rodzajami kontenerów, a pierwszy połów zostanie dopasowany. W konsekwencji, pojemnik typu Container[Double]
zostanie dopasowany przez pierwszy przypadek, który przechwytuje obiekty Container[String]
, więc metoda zostanie wywołana na Double
i zostanie wyrzucony java.lang.ClassCastException
.
Jak dopasować parametr Container
sparametryzowany przez określony typ?
Dodałem tam odpowiedź na to samo pytanie: [link] (http://stackoverflow.com/questions/35181533/can-we-elegantly-match-an-erased-type-in-scala/35181934#35181934) – dth