【发布时间】:2014-02-24 12:02:52
【问题描述】:
我对以下代码感到困惑:
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 参数是什么。
那么为什么编译器在分配 var 时需要强制转换为 T?它不应该在编译时知道 LinkedList 可以分配给 List 吗?
我知道代码是伪造的,并且我理解为什么它在运行时有效,尽管它看起来不应该。令我困惑的部分是为什么编译器要求我在赋值时输入 (T)?然而,它编译得非常好,没有虚假的演员表。
大概,编译器理解擦除。似乎编译器也应该能够在没有强制转换的情况下编译代码。
【问题讨论】: