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)
在你的第一个片段:
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\nList<?> j = null;\nList<Integer> j2 = (List<Integer>)j;\n\nList<List<?>> i = null;\nList<List<Integer>> i2 = (List<List<Integer>>) (List<?>) i;\nRun Code Online (Sandbox Code Playgroud)\n\n编译得很好。您只需要进行额外的转换即可添加一点缓冲区。
\n\n请参阅此处: http: //ideone.com/xh88lX
\n\n如果您想知道原因,请查看此处
\n\n基本上,这是相关信息\n这是查看它的另一种方式:
\n\nList<Integer>不是List<Number>List<Integer>可以被 a 捕获转换List<?>,但 aList<List<Integer>>不是List<List<?>>List<? extends\xe2\x80\x80Number>可以捕获转换 aList<Integer>List<? extends\xe2\x80\x80List<?>>可以捕获转换 aList<List<Integer>>| 归档时间: |
|
| 查看次数: |
1216 次 |
| 最近记录: |