Pourquoi une ClassCastException ne levée lorsque la valeur de retour est accessible?

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

  •  13-09-2019
  •  | 
  •  

Question

cette question

Compte tenu de cette fonction:

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

Pourquoi cette invocation exécution sans exception:

foo("hello");

Mais celui-ci jette ClassCastException?

System.out.println(foo("hello"));
Était-ce utile?

La solution

Génériques en Java 5/6 sont effacés type , ce qui signifie que tout type générique est fondamentalement juste un type Object (ou quel que soit le type le moins de dénominateur commun est, qui est dans ce cas CharSequence) lors de l'exécution. Les moulages appropriés sont insérés chaque fois que nécessaire. Donc, votre méthode reçoit le type effacée à quelque chose qui ressemble à ceci:

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

Et votre appel reçoit le type effacée à ceci:

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

Apparemment Java ne dérangera pas l'insertion de la fonte (String) si la valeur de retour est jamais utilisé, pourquoi la peine?

Autres conseils

Les types génériques ne sont disponibles que pour le compilateur, et sont erasured (essentiellement omis) lors de l'exécution. Ainsi, la distribution est ignorée dans la méthode

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top