java中参数化和原型类型实例化的区别

时间:2015-07-03 14:42:42

标签: java generics

说,我有一个Alpha课,有两个正式参数K and V

现在,我想用具体类型CK and CV初始化它的对象。

我想知道,

之间的区别是什么
Alpha<CK, CV> alpha = new Alpha<CK, CV>();

Alpha<CK, CV> alpha = new Alpha();

因为,两者都不允许我写下或读取除声明之外的任何内容。而且,因为泛型只是为了确保编译时的类型安全性,如果我不能做任何错误,它为什么会抛出警告?

1 个答案:

答案 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);