Я запутался следующий код:Смущает Java генериков, требующих слепок
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class GenericsTest<T extends List> {
public void foo() {
T var = (T) new LinkedList();
}
public static void main(String[] args) {
GenericsTest<ArrayList> gt1 = new GenericsTest<ArrayList>();
gt1.foo();
System.out.println("Done");
}
}
Тип времени выполнения T
, как представляется, быть java.util.List
, независимо от того, какой тип параметра я передал в конструктор.
Итак, почему компилятор требует отливки до T
при назначении var? Должна ли она знать во время компиляции, что LinkedList
можно назначить List?
Я понимаю, что код является фиктивным, и я понимаю, почему он работал во время выполнения, хотя похоже, что это не так. Часть, которая меня смущает, почему компилятор требует, чтобы я набирал (T) при выполнении задания? Тем не менее, он отлично компилируется без фиктивного литья.
Предположительно, компилятор понимает стирание. Похоже, что компилятор должен иметь возможность компилировать код без приведения.
Спасибо за ссылку. Это объясняет, почему тип среды выполнения List ... и я не получаю исключение ClassCastException. Однако, по-видимому, компилятор знает, что так зачем нужно, чтобы приведение к (T). Есть ли какой-нибудь возможный способ, когда бросок может провалиться? –