Ihre Umwandlungsmethode erstellt eine unchecked conversion, die speziell in der JVM behandelt wird, um Abwärtskompatibilität mit nicht-generischem Code zu gewährleisten.
Solche Aufrufe können im Typsystem mit Generika nicht als statisch sicher angezeigt werden. Das Ablehnen solcher Aufrufe würde große Teile des vorhandenen Codes ungültig machen und sie daran hindern, neuere Versionen der Bibliotheken zu verwenden. JLS 5.1.9
die Methode ohne explizite Typparameter aufrufen wird der Compiler veranlassen, den Typ-Parameter der Anrufungen zu schließen, in diesem Fall auf der Grundlage ihrer erwarteten Rückgabetyp. Type Inference, JLS 15.12.2.7.. Dies bedeutet, dass Code wird diese equvivalent:
String foo = Caster.<String>cast("hi"); // no exception
int bar = Caster.<Integer>cast("1"); // runtime ClassCastException
Urtyp ihre Box-Version abgeleitet werden:
Wenn A eine primitive Art ist, dann ist A zu einem Referenz-Typ U über Boxen Umwandlung umgewandelt und dieser Algorithmus wird rekursiv auf die Einschränkung U angelegt < < F. JLS 15.12.2.7.
die JVM Sicherheit gewährleistet Typ von Laufzeittyp prüft dabei auf die Rückgabewerte von Funktionen co Wenn ich nicht markierte Abgüsse an dem ersten Punkt halte, wo die Typinformation nicht gelöscht wird (ich habe es nicht explizit in der Spezifikation gefunden, aber die Dinge scheinen so zu funktionieren, obwohl es in The Java Tutorials erwähnt wird). In diesem Fall, in dem Sie versuchen, den Wert einer typisierten lokalen Variablen zuzuweisen, wird der Typ des Rückgabewerts überprüft, was zu einer ClassCastException
führt.
Um etwas mehr Idee zu geben, wenn die erzwungene Laufzeit Typprüfung Guss geschieht, sind hier ein paar Beispiele:
Object a3 = Caster.<String>cast(3); // no exception, a3 is now Integer
Object a4 = (String)Caster.<String>cast(3); // an explicit cast causes runtime ClassCastException
EDIT:
Hier ist eine Stackoverflow Frage, wann Laufzeittyp sind checks erzwungen: When is generic return value of function casted after type erasure?
@KLibby Es ist in der Methode deklariert. Es heißt 'public static T cast (Objektwert) {'. Beachten Sie die ''. –
TheCoffeeCup
Die Klassendeklaration ist einfach 'public class Test {'. – TheCoffeeCup
Die zweite gibt mir eine Laufzeitausnahme, kein Fehler bei der Kompilierung. Sprechen Sie darüber? – markspace