如何在Java中正确地嵌套嵌套泛型类型

JRR*_*JRR 16 java generics casting

在Java中我可以演员:

List<?> j = null;
List<Integer> j2 = (List<Integer>)j;
Run Code Online (Sandbox Code Playgroud)

那么为什么以下失败呢?

List<List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>)i;
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 6

在你的第一个片段:

List<?> j = null;
List<Integer> j2 = (List<Integer>)j;
Run Code Online (Sandbox Code Playgroud)

编译器不会给你错误,因为List<?>它是超类型的List<Integer>,因为通配符表示的类型系列"?"是超集Integer.所以,你可以从执行转换List<?>List<Integer>(A垂头丧气,你可以说),但是编译器会告诉你一个未经检查的警告,为您节省免受比如说铸造- List<Date>List<Integer>.显示警告,因为由于类型擦除,转换将在运行时成功.


第二种情况下:

List<List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>)i;
Run Code Online (Sandbox Code Playgroud)

在这里你是从List<List<?>>(从这里引用FIRST)到List<List<Integer>>(从这里引用SECOND).

因为,第一是不是一个超级类型的第二,显然是因为记类型的家庭List<?>(也可以是List<Long>,List<Date>,List<String>或任何东西)是不是一个超级组List<Integer>.因此编译器错误.

推荐阅读:


小智 1

我猜您需要进行通配符转换才能将其转换为您想要的内容。

\n\n
List<?> j = null;\nList<Integer> j2 = (List<Integer>)j;\n\nList<List<?>> i = null;\nList<List<Integer>> i2 = (List<List<Integer>>) (List<?>) i;\n
Run Code Online (Sandbox Code Playgroud)\n\n

编译得很好。您只需要进行额外的转换即可添加一点缓冲区。

\n\n

请参阅此处: http: //ideone.com/xh88lX

\n\n

如果您想知道原因,请查看此处

\n\n

基本上,这是相关信息\n这是查看它的另一种方式:

\n\n
    \n
  • Java泛型是类型不变的
  • \n
  • 存在从整数到数字的转换,但 aList<Integer>不是List<Number>
  • \n
  • 类似地, aList<Integer>可以被 a 捕获转换List<?>,但 aList<List<Integer>>不是List<List<?>>
  • \n
  • 使用有界通配符, aList<? extends\xe2\x80\x80Number>可以捕获转换 aList<Integer>
  • \n
  • 类似地, aList<? extends\xe2\x80\x80List<?>>可以捕获转换 aList<List<Integer>>
  • \n
\n