使用参数化类对象列表进入一些可疑行为:
ArrayList<Class<String>> classList = new ArrayList<Class<String>>();
classList.add(Integer.class); //compile error
Class intClass = Integer.class;
classList.add(intClass); //legal apparently, as long as intClass is not parameterized
找到了LinkedList的相同行为,没有尝试过其他集合。这是有原因的吗?或者我偶然发现了什么?
答案 0 :(得分:0)
这会生成“未经检查的转化”警告。
Class
(而不是Class<String>
或Class<?>
或Class<Object>
)是原始类型。可以从参数化类型中分配原始类型而不会出现错误,但会收到警告。这种类型的赋值只是一个警告,因此您可以拥有仅部分生成的代码库。另请参阅the section of the JLS on raw types。
答案 1 :(得分:0)
这仅仅是向后兼容的让步是合法的,因此在Java 5之前编写的代码可以在5或更晚的版本中编译而无需通过并添加泛型。出于其他原因使用原始类型通常被认为是编程错误或至少是糟糕的风格/懒惰。
通过故意声明原始类型,您放弃了编译器帮助您进行类型安全的能力,因此您会收到警告,并且它会重新发送给您,以确保在运行时安全无虞。