Perché è un ClassCastException gettato solo quando il valore di ritorno si accede?

StackOverflow https://stackoverflow.com/questions/1268623

  •  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"));
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top