转换为Generic类型java(为什么未选中)

Flo*_*ger 1 java generics

我想知道为什么以下演员阵容未经检查:

==更新1 ==

我知道我们在运行时有类型擦除.介意输入参数是一个ArrayList而不是一些随机列表.ArrayList实施ListRandomAccess.我知道这个演员不适用于LinkedListMySpecialArrayList.但是这个方法的参数禁止这样做.我知道(直到人们移除ListRandomAccessArrayList演员阵容不会在运行时失败,但为什么演员阵容未经检查?

==结束更新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(不是运行时类型,但编译器应该得到它.

重新解释一下这个问题:为什么它不适用于泛型参数返回类型?谢谢

Swe*_*per 5

在第一个和第二个示例中,您将转换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)

这不起作用,因为你不能强制数组列表成为链表!它们是不同的数据结构!

为什么第三个工作呢?

在第三个例子,你声明明确表示:"我想这ArrayListList".这是有效的,因为你投射的类型instance是确定的.ArrayList实现List,所以它必须与它兼容!

方法不会像LinkedList子类一样进行编译,List如果没有强制转换,这不起作用....请解释一下,我只允许ArrayListin而没有其他子类List

嗯,是的,你只允许ArrayList传入方法.但该方法的返回类型是L.从泛型约束中,我们知道L可以是任何实现的类型List.但是,您无法转换ArrayListList通过强制转换实现的任何类型.