2009-08-12 3 views
1

Bezug zu this questionWarum wird eine ClassCastException nur ausgelöst, wenn auf den Rückgabewert zugegriffen wird?

diese Funktion Gegeben:

public static <S extends CharSequence> S foo(S s) { 
    return (S) new StringBuilder(s); 
} 

Warum dieser Aufruf ohne Ausnahme aus:

foo("hello"); 

Aber dies wirft Classcast?

+0

Hat Ihr Compiler Sie nicht gewarnt? –

+0

Es warnte in der Methode, aber nicht auf beiden Aufruf - war neugierig darüber, warum ein Aufruf funktionierte und der andere warf die Ausnahme. – Brabster

Antwort

6

Generics in Java 6.5 sind type-erased, was bedeutet, dass jeder generischer Typ ist im Grunde nur ein Object Typ (oder was auch immer der kleinste gemeinsame Nenner Typ ist, der in diesem Fall ist CharSequence) zur Laufzeit. Die passenden Modelle werden überall dort eingefügt, wo sie benötigt werden. So wird Ihre Methode, um etwas typ gelöscht, die wie folgt aussieht:

public static CharSequence foo(CharSequence s) { 
    return (CharSequence) new StringBuilder(s); 
} 

und Ihr Anruf wird typ gelöscht dies:

System.out.println((String)foo("hello")); 

Offenbar Java wird nicht die Mühe Einsetzen des (String) gegossen, wenn die Rückgabewert wird nie verwendet - warum?

3

Generische Typen stehen nur dem Compiler zur Verfügung und werden zur Laufzeit gelöscht (grundsätzlich weggelassen). So ist die Besetzung innerhalb der Methode ignoriert

Verwandte Themen