Twoja metoda rzutowania to unchecked conversion, obsługiwana specjalnie w JVM w celu zachowania zgodności wstecz z nietypowym kodem.
Nie można wykazać, że takie połączenia nie są statycznie bezpieczne w systemie typu przy użyciu generycznych. Odrzucenie takich wywołań spowoduje unieważnienie dużych ciał istniejącego kodu i uniemożliwi korzystanie z nowszych wersji bibliotek. JLS 5.1.9
Wywołanie metody bez parametrów typu wyraźnych spowoduje kompilator notowanym parametr rodzaj inwokacji, w tym przypadku na podstawie przewidywanego rodzaju powrotnego. Type Inference, JLS 15.12.2.7.. Oznacza to, że kod jest equvivalent do tego:
String foo = Caster.<String>cast("hi"); // no exception
int bar = Caster.<Integer>cast("1"); // runtime ClassCastException
typie pierwotnym będzie wnioskować do ich pudełkowej wersji:
Jeżeli A jest prymitywny typ, to A jest konwertowany do typu odniesienia U poprzez konwersję boksu i ten algorytm jest stosowana rekurencyjnie do ograniczenia U < < F. JLS 15.12.2.7.
JVM zapewnia Typ bezpieczeństwa wykonując kontrole typu wykonawczego na wartości zwracane funkcji CO Pobieranie niezaznaczonych rzutów, w pierwszym punkcie, w którym informacja o typie nie została usunięta (nie znalazłem tego wyraźnie w specyfikacji, ale rzeczy wyglądają tak, aby działać w ten sposób, chociaż jest wspomniany w The Java Tutorials). W tym przypadku, gdy spróbujesz przypisać wartość do wpisanej zmiennej lokalnej, sprawdzany jest typ zwracanej wartości, co daje ClassCastException
.
Aby dać trochę więcej pojęcia, kiedy to egzekwowane Runtime typu sprawdzanie obsada dzieje, oto kilka innych przykładów:
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:
Oto StackOverflow pytanie o to, kiedy są typu Runtime kontrole zostały wykonane: When is generic return value of function casted after type erasure?
@KLibby Zostało to zadeklarowane w metodzie. Mówi "public static T cast (wartość obiektu) {'. Zwróć uwagę na ''. –
TheCoffeeCup
Deklaracja klasy jest po prostu "publicznym testem klasy". – TheCoffeeCup
Drugi daje mi wyjątek środowiska wykonawczego, a nie błąd czasu kompilacji. Czy o tym mówisz? – markspace