Perché è un ClassCastException gettato solo quando il valore di ritorno si accede?
-
13-09-2019 - |
Domanda
In relazione al questa domanda
Data questa funzione:
public static <S extends CharSequence> S foo(S s) {
return (S) new StringBuilder(s);
}
Perché questa invocazione esegue senza eccezione:
foo("hello");
Ma questo getta ClassCastException?
System.out.println(foo("hello"));
Soluzione
Generics Java 5/6 sono tipo cancellati , il che significa che qualsiasi tipo generico è fondamentalmente solo un tipo Object
(o qualunque sia il tipo minimo comune denominatore è, che è in questo caso CharSequence
) in fase di esecuzione. I calchi appropriati vengono inseriti ovunque sia necessario. Così il vostro metodo ottiene Type-cancellati a qualcosa che assomiglia a questo:
public static CharSequence foo(CharSequence s) {
return (CharSequence) new StringBuilder(s);
}
E la chiamata arriva tipo-cancellati a questo:
System.out.println((String)foo("hello"));
A quanto pare Java non preoccuparsi di inserire nel cast (String)
se il valore di ritorno non è mai usato-perché preoccuparsi?
Altri suggerimenti
tipi generici sono disponibili solo per il compilatore, e sono erasured (sostanzialmente omessi) in fase di esecuzione. Quindi il cast viene ignorata all'interno del metodo