Stavo cercando di rispondere alla domanda this, come pensavo di conoscere la risposta. Risulta, non sapevo abbastanza:/Perché talvolta `.asInstanceOf` lancia, e talvolta no?
Ecco un test che ho fatto:
class Inst[T] {
def is(x: Any) = scala.util.Try { as(x) }.isSuccess
def as(x: Any): T = x.asInstanceOf[T]
}
scala> new Inst[String].is(3)
res17: Boolean = true
scala> new Inst[String].as(3)
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
... 33 elided
cosa sta succedendo qui? Perché solo la seconda chiamata al lancio as
, ma non la prima?
No, questo non sembra per spiegare molto: ho cambiato la definizione di 'is' in:' def is (x: Any) = scala.util.Try {as (x) .toString} .isSuccess', e restituisce ancora 'true' (cioè, il il cast non getta). Anche questo 'def è (x: Any) = scala.util.Try {println (as (x) .toString)} .isSuccess;' stampa felicemente "3" e restituisce true: -/ – Dima
Vedere la mia modifica –
Ah, ora ha senso, grazie! 'is' non sa cosa sia' T', quindi tratta l'argomento come 'Any'. Ho provato questo: 'tratto Foo {def foo = ??? } class Inst [T <: Foo] {def is (x: Any) = scala.util.Try {as (x) .foo} .isSuccess; def as (x: Any): T = x.asInstanceOf [T]; } '. Ora 'new Inst [Foo] .is (3)' restituisce 'false' come previsto. – Dima