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

java中参数化和原始类型实例化的区别,java,generics,Java,Generics,比如说,我有一个类Alpha,它有两个形式参数K和V 现在,我想用具体类型CK和CV初始化它的一个对象 我想知道,它们之间有什么区别 Alpha<CK, CV> alpha = new Alpha<CK, CV>(); Alpha-Alpha=新的Alpha(); 以及 Alpha-Alpha=新的Alpha(); 因为,他们都不允许我写或读任何东西,除了他们声明的内容。而且,既然泛型只是为了确保编译时的类型安全,那么如果我不能对它做任何错误,为什么它会抛出警告呢

比如说,我有一个类
Alpha
,它有两个形式参数
K和V

现在,我想用具体类型
CK和CV
初始化它的一个对象

我想知道,它们之间有什么区别

Alpha<CK, CV> alpha = new Alpha<CK, CV>();
Alpha-Alpha=新的Alpha();
以及

Alpha-Alpha=新的Alpha();
因为,他们都不允许我写或读任何东西,除了他们声明的内容。而且,既然泛型只是为了确保编译时的类型安全,那么如果我不能对它做任何错误,为什么它会抛出警告呢

Alpha<CK, CV> alpha = new Alpha();
Alpha-Alpha=新的Alpha();
在左侧,您使用的是泛型类型Alpha,而在右侧,您使用的是原始类型Alpha。Java中的原始类型实际上只是为了与泛型之前的代码兼容而存在的,并且不应该在新代码中使用,除非您必须这样做

对于
Alpha 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);
列出字符串=…//包含一些字符串的列表
//完全合法,因为您使用了原始类型并丢失了所有类型检查!
列表整数=新链接列表(字符串);
泛型的存在是为了提供编译时保护,防止做错误的事情。在上面的示例中,使用raw类型意味着您无法获得此保护,并且在运行时会出现错误。这就是为什么不应该使用原始类型

// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);
//不合法,因为右侧实际上是通用的!
列表整数=新链接列表(字符串);

您之前做过哪些研究?你知道,就像阅读Oracle关于泛型的优秀教程一样,它很好地回答了你所有的问题……是的。我知道:)。我想知道的是,如果用参数化类型进行声明和实例化,那么这样声明会有什么不好的地方呢?谢谢。@pkeakhjoko我编辑:)谢谢:)。那么,如果构造函数不带参数,你能想到什么问题吗?
// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);