Frage

Einschlägige diese Frage

Da diese Funktion:

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

Warum dieser Aufruf ausführen, ohne Ausnahme:

foo("hello");

Aber das wirft man Classcast?

System.out.println(foo("hello"));
War es hilfreich?

Lösung

Generics in Java 6.5 sind Typ gelöscht , was bedeutet, dass jeder generischer Typ (oder was auch immer der kleinste gemeinsame Nenner Typ ist, der in diesem Fall ist Object) zur Laufzeit im Grunde nur ein CharSequence Typ ist. Die entsprechenden Abgüsse sind überall dort, wo erforderlich, eingefügt. So Ihre Methode wird typ gelöscht etwas, das wie folgt aussieht:

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

Und Ihr Anruf wird typ gelöscht folgt aus:

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

Offenbar Java wird nicht die Mühe Einsetzen der (String) gegossen, wenn der Rückgabewert nie benutzt, warum ist die Mühe machen?

Andere Tipps

Allg Typen sind nur für den Compiler zur Verfügung, und erasured werden zur Laufzeit (grundsätzlich weggelassen). So ist die Besetzung innerhalb der Methode ignoriert

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top