为什么编译器允许我将一个泛型集合分配给声明为特定于类的集合的变量?

时间:2012-10-10 08:54:38

标签: java generics

我无法理解为什么java编译器允许为非特定集合分配已指定变量的集合。像这样:

    ArrayList list = new ArrayList();
    // Operations on list
    ArrayList<String> stringList = list;

在这种情况下可能存在各种类型的转换错误,在我看来,如果编译器阻止您首先执行此操作会更有意义。

我只是在问,因为我很好奇这个语言的这个有点奇怪的方面,我实际上并没有让代码工作有困难(虽然我可能有一天我需要使用各种类型的ArrayList其中的课程。)

2 个答案:

答案 0 :(得分:6)

它仅用于在泛型或java 5之前支持遗留代码。

Java SE 5和Collection中引入的泛型一直在运行。因此,如果您在1.5之前看到Collection框架,则会看到ArrayList,但没有generic

答案 1 :(得分:2)

由于使用原始类型(例如没有泛型参数的ArrayList)会导致警告(如果没有被抑制),您还可以考虑使用“-Werror”标志来“警告失败”:

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html

(虽然就个人而言,我还没有使用过这面旗帜)