Ich habe versucht, this Frage zu beantworten, da ich dachte, ich wüsste die Antwort. Es stellte sich heraus, ich habe nicht genug wissen:/Warum wirft `.asInstanceOf 'manchmal und manchmal nicht?
Hier ist ein Test, den ich getan habe:
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
Was ist hier los? Warum wirft nur der zweite Anruf as
, aber nicht den ersten?
Nein, das scheint nicht viel zu erklären: Ich habe die 'is' Definition geändert in: 'def ist (x: Any) = scala.util.Try {als (x) .toString} .isSuccess', und es gibt immer noch' true' (dh die Wurf wirft nicht). Sogar dieses 'def ist (x: Any) = scala.util.Try {println (als (x) .toString)} .isSuccess;' gibt glücklich "3" aus und gibt true zurück: -/ – Dima
Bitte sehen meine edit –
Ah, es macht jetzt Sinn, danke! 'is' weiß nicht, was' T' ist, also behandelt es das Argument als 'Any'. Ich habe es versucht: 'trait Foo {def foo = ??? } Klasse Inst [T <: Foo] {def ist (x: Beliebig) = scala.util.Try {as (x) .foo} .isSuccess; def as (x: beliebig): T = x.asInstanzOf [T]; } '. Nun gibt 'new Inst [Foo] .is (3)' wie erwartet "false" zurück. – Dima