参数化Class对象的java集合的奇怪行为

时间:2011-01-07 23:46:27

标签: java

使用参数化类对象列表进入一些可疑行为:

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的相同行为,没有尝试过其他集合。这是有原因的吗?或者我偶然发现了什么?

2 个答案:

答案 0 :(得分:0)

这会生成“未经检查的转化”警告。

Class(而不是Class<String>Class<?>Class<Object>)是原始类型。可以从参数化类型中分配原始类型而不会出现错误,但会收到警告。这种类型的赋值只是一个警告,因此您可以拥有仅部分生成的代码库。另请参阅the section of the JLS on raw types

答案 1 :(得分:0)

这仅仅是向后兼容的让步是合法的,因此在Java 5之前编写的代码可以在5或更晚的版本中编译而无需通过并添加泛型。出于其他原因使用原​​始类型通常被认为是编程错误或至少是糟糕的风格/懒惰。

通过故意声明原始类型,您放弃了编译器帮助您进行类型安全的能力,因此您会收到警告,并且它会重新发送给您,以确保在运行时安全无虞。