java中参数化和原始类型实例化之间的泛型差异
比如说,我有一个类Alpha
,它有两个形式参数K and V
现在,我想用具体类型CK and CV
初始化它的一个对象
我想知道,它们之间有什么区别
Alpha<CK, CV> alpha = new Alpha<CK, CV>();
以及
Alpha<CK, CV> alpha = new Alpha();
因为,他们都不允许我写或读任何东西,除了他们声明的内容。而且,既然泛型只用于在编译时确保类型安全,那么如果我不能对它做任何错误,为什么它会抛出警告呢
# 1 楼答案
问题在于
在左侧,您使用的是泛型类型Alpha,而在右侧,您使用的是原始类型Alpha。Java中的原始类型实际上只是为了与泛型之前的代码兼容而存在的,并且不应该在新代码中使用,除非您必须这样做
对于
Alpha<CK, CV> alpha = new Alpha()
的原始示例,编译器会为该赋值生成一个警告,因为它必须。考虑这一点:泛型的存在是为了提供编译时保护,防止做错误的事情。在上面的示例中,使用raw类型意味着您无法获得此保护,并且在运行时会出现错误。这就是为什么不应该使用原始类型