Przeczytałem o usuwaniu typu Java na stronie Oracle .
Kiedy następuje usunięcie typu? W czasie kompilacji czy w czasie wykonywania? Kiedy klasa jest załadowana? Kiedy instancja klasy jest tworzona?
Wiele stron (w tym oficjalny samouczek wspomniany powyżej) twierdzi, że kasowanie typu występuje podczas kompilacji. Jeśli informacje o typie zostaną całkowicie usunięte w czasie kompilacji, w jaki sposób JDK sprawdza zgodność typu, gdy wywoływana jest metoda wykorzystująca ogólne, bez informacji o typie lub informacji o niewłaściwym typie?
Rozważmy następujący przykład: klasa Say A
ma metody empty(Box<? extends Number> b)
. Kompilujemy A.java
i otrzymujemy plik klasy A.class
.
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
Teraz możemy utworzyć inną klasę B
, która wywołuje metodę empty
z non-parametryzowanego argumentu typu (RAW) empty(new Box())
. Jeśli kompilujemy B.java
się A.class
w ścieżce klas, javac jest wystarczająco inteligentny, aby wywołać ostrzeżenie. Więc A.class
ma jakieś informacje o typie przechowywanych w nim.
public class B {
public static void invoke() {
// java: unchecked method invocation:
// method empty in class A is applied to given types
// required: Box<? extends java.lang.Number>
// found: Box
// java: unchecked conversion
// required: Box<? extends java.lang.Number>
// found: Box
A.empty(new Box());
}
}
Domyślam się, że kasowanie typu ma miejsce, gdy klasa jest ładowana, ale to tylko przypuszczenie. Kiedy to się stanie?