我想知道为什么以下演员阵容未经检查:
==更新1 ==
我知道我们在运行时有类型擦除.介意输入参数是一个ArrayList而不是一些随机列表.ArrayList实施List和RandomAccess.我知道这个演员不适用于LinkedList或MySpecialArrayList.但是这个方法的参数禁止这样做.我知道(直到人们移除List或RandomAccess从ArrayList演员阵容不会在运行时失败,但为什么演员阵容未经检查?
==结束更新1 ==
private static <L extends List<GenericTokenType<?>> & RandomAccess> L castArrayList(ArrayList<GenericTokenType<?>> instance) {
return (L) instance;
}
Run Code Online (Sandbox Code Playgroud)
我简化为[仍然警告]
private static <L extends List> L castArrayList(ArrayList instance) {
return (L) instance;
}
Run Code Online (Sandbox Code Playgroud)
和[没有警告]
private static List castArrayList(ArrayList instance) {
return (List) instance;
}
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用.L是一个List(不是运行时类型,但编译器应该得到它.
重新解释一下这个问题:为什么它不适用于泛型参数返回类型?谢谢
在第一个和第二个示例中,您将转换ArrayList为一个名为的类型L.根据通用约束,L还必须实现List接口.因此,L可能是ArrayList,LinkedList,Stack或者Vector,或者一些其他类,需要创建一个实现List.
到目前为止一切都那么好吧?
现在让我们假设L一个ArrayList表达式相当于:
(ArrayList) instance
Run Code Online (Sandbox Code Playgroud)
显然这会起作用.
但是如果L是的话LinkedList呢?
(LinkedList) instance
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为你不能强制数组列表成为链表!它们是不同的数据结构!
为什么第三个工作呢?
在第三个例子,你声明明确表示:"我想这ArrayList是List".这是有效的,因为你投射的类型instance是确定的.ArrayList实现List,所以它必须与它兼容!
方法不会像
LinkedList子类一样进行编译,List如果没有强制转换,这不起作用....请解释一下,我只允许ArrayListin而没有其他子类List
嗯,是的,你只允许ArrayList传入方法.但该方法的返回类型是L.从泛型约束中,我们知道L可以是任何实现的类型List.但是,您无法转换ArrayList为List通过强制转换实现的任何类型.
| 归档时间: |
|
| 查看次数: |
334 次 |
| 最近记录: |