Usando .isInstanceOf[GenericType[SomeOtherType]]
, dove GenericType
e SomeOtherType
sono tipi arbitrarie (di adatta natura), il compilatore Scala dà un avvertimento incontrollato a causa della tipologia di cancellazione:Perché `Some (123) .isInstanceOf [Option [List [String]]] * * non fornisce un avviso non controllato?
scala> Some(123).isInstanceOf[Option[Int]]
<console>:8: warning: non variable type-argument Int in type Option[Int] is unchecked since it is eliminated by erasure
Some(123).isInstanceOf[Option[Int]]
^
res0: Boolean = true
scala> Some(123).isInstanceOf[Option[String]]
<console>:8: warning: non variable type-argument String in type Option[String] is unchecked since it is eliminated by erasure
Some(123).isInstanceOf[Option[String]]
^
res1: Boolean = true
Tuttavia, se SomeOtherType
è essa stessa un tipo generico (es List[String]
), nessun avviso viene emesso:
scala> Some(123).isInstanceOf[Option[List[String]]]
res2: Boolean = true
scala> Some(123).isInstanceOf[Option[Option[Int]]]
res3: Boolean = true
scala> Some(123).isInstanceOf[Option[List[Int => String]]]
res4: Boolean = true
scala> Some(123).isInstanceOf[Option[(String, Double)]]
res5: Boolean = true
scala> Some(123).isInstanceOf[Option[String => Double]]
res6: Boolean = true
(Ricordiamo che tuple e =>
sono zucchero sintattico per Tuple2[]
e Function2[]
tipi generici)
Perché non viene emesso alcun avviso? (Tutti questi sono nella Scala REPL 2.9.1, con l'opzione -unchecked
.)
Grande indagine! –
Effettivamente, buon lavoro! – pedrofurla
+1 per aver citato il compilatore. :-) –