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

参数化类对象的java集合的奇怪行为,java,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

使用参数化类对象列表时遇到一些可疑行为:

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
ArrayList类列表=新建ArrayList();
classList.add(Integer.class)//编译错误
Class intClass=Integer.Class;
classList.add(intClass)//显然是合法的,只要intClass没有参数化
找到LinkedList的相同行为,尚未尝试其他集合。这样是有原因的吗?还是我偶然发现了什么?

这会生成一个“未经检查的转换”警告


Class
(而不是
Class
Class
Class
)是原始类型。可以将原始类型从参数化类型分配到,但不会出错,但会收到警告。这种类型的赋值只是一个警告,因此您可以拥有一个仅部分泛化的代码库。另请参见。

,这仅作为向后兼容性的让步是合法的,这样在Java 5之前编写的代码可以在5或更高版本中编译,而无需经过和添加泛型。出于另一个原因使用原始类型通常被认为是编程错误,或者至少是风格不佳/懒惰


通过故意声明原始类型,您将放弃编译器帮助您实现类型安全的功能,因此您将得到一个警告,您需要确保在运行时一切都是安全的。

我认为您应该得到一个编译警告,而不是错误。这不是新的,也不是可疑的。您在强制转换到未参数化的类对象时删除了信息。编译器可以并将警告您这一点,但希望您在类未参数化时进行自己的验证。而且,这可能会一直运行,直到您从列表中获取实例为止。然后您将得到一个类强制转换异常。除了错误之外,为什么要使用“类”?我假设您真正需要的是“类”,除非您希望类是特定类型的子类型,比如“类”可能是一个人为的示例,因为上次我检查字符串是final,所以没有任何扩展它。为什么你会有一个只能是String.class的多个类的列表?谢谢大家的帮助。我很惊讶编译器会在类元素进入ArrayList时袖手旁观,但在更好地理解原始类型之后,这才有意义。是的,我的例子是人为的。。