说,我有一个Alpha
课,有两个正式参数K and V
。
现在,我想用具体类型CK and CV
初始化它的对象。
我想知道,
之间的区别是什么Alpha<CK, CV> alpha = new Alpha<CK, CV>();
和
Alpha<CK, CV> alpha = new Alpha();
因为,两者都不允许我写下或读取除声明之外的任何内容。而且,因为泛型只是为了确保编译时的类型安全性,如果我不能做任何错误,它为什么会抛出警告?
答案 0 :(得分:1)
的问题
Alpha<CK, CV> alpha = new Alpha();
是在左侧,您使用的是泛型Alpha,右侧是使用原始类型Alpha。 Java中的原始类型实际上只存在与pre-generics代码的兼容性,除非绝对必须,否则不应在新代码中使用。
就原始的Alpha<CK, CV> alpha = new Alpha()
示例而言,编译器会为该分配生成警告,因为它必须。考虑一下:
List<String> strings = ... // some list that contains some strings
// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);
泛型存在提供编译时保护,防止做错事。在上面的示例中,使用原始类型意味着您无法获得此保护,并且在运行时将收到错误。这就是你不应该使用原始类型的原因。
// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);