Меня смущает следующий код:
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
, независимо от того, какой параметр Type я передал конструктору.
Итак, почему компилятор требует преобразования в T
при назначении var? Разве он не должен знать во время компиляции, что LinkedList
может быть назначен List?
Я понимаю, что это подделка, и понимаю, почему он работал во время выполнения, хотя, похоже, не должен. Меня сбивает с толку, почему компилятор требует, чтобы я набирал (T) при выполнении задания? Тем не менее, он отлично компилируется без ложного приведения.
Предположительно, компилятор понимает стирание. Похоже, что компилятор также должен уметь компилировать код без приведения.