Warum wirft '.asInstanceOf' manchmal und manchmal nicht?

8

Ich habe versucht, diese Frage zu beantworten, da ich dachte, ich wüsste die Antwort. Stellt sich heraus, ich wusste nicht genug genug: /

Hier ist ein Test, den ich gemacht habe:

%Vor%

Was ist hier los? Warum wirft nur der zweite Aufruf von as , aber nicht der erste?

    
Dima 10.12.2015, 14:31
quelle

2 Antworten

10

Das liegt daran, dass die class-cast-Ausnahme nur ausgelöst wird, wenn Sie etwas mit dem Wert tun, rufen Sie nach dem Cast eine Methode auf. In der REPL zum Beispiel hätten Sie im zweiten Fall einen toString -Aufruf. Hinweis:

%Vor%

Der Grund dafür ist, dass Inst[T] generisch ist mit type Parameter T , das zur Laufzeit gelöscht wird; Nur wenn die Aufruf-Site (die eine statische Kenntnis des Typs T hat) versucht, eine Methode für das Ergebnis aufzurufen, findet die tatsächliche Typprüfung statt.

Für Ihre Folgefrage ist toString für jedes Objekt definiert, und da T generisch ist, haben Sie eine eingerahmte Ganzzahl ( <: AnyRef ) und toString und println erfolgreich innerhalb der Methode is . Ein weiteres Beispiel, bei dem Try fehlschlagen würde, ist dies:

%Vor%     
0__ 10.12.2015, 14:40
quelle
2

Während @ 0 __s Antwort erklärt, warum es nicht funktioniert, hier ist, wie es funktioniert:

%Vor%     
Alexey Romanov 10.12.2015 19:06
quelle

Tags und Links