gpt4 book ai didi

java - 转换为通用类型 java(为什么未选中)

转载 作者:行者123 更新时间:2023-11-29 09:59:29 25 4
gpt4 key购买 nike

我想知道为什么未选中以下转换:

== 更新 1 ==

我知道我们在运行时有类型删除。请注意,输入参数是一个 ArrayList 而不是某个随机列表。ArrayList 实现了 ListRandomAccess。我知道此转换不适用于 LinkedListMySpecialArrayList。但是此方法的参数禁止这样做。我知道(除非人们从 ArrayList 中删除 ListRandomAccess,否则转换不会在运行时失败,但为什么未检查转换?

== 结束更新 1 ==

  private static <L extends List<GenericTokenType<?>> & RandomAccess> L castArrayList(ArrayList<GenericTokenType<?>> instance) {
return (L) instance;
}

我将其简化为[仍然警告]

  private static <L extends List> L castArrayList(ArrayList instance) {
return (L) instance;
}

和[无警告]

 private static List castArrayList(ArrayList instance) {
return (List) instance;
}

为什么这不起作用。 L 是一个 List(不是运行时类型,但编译器应该得到它。

换句话说这个问题:为什么它不能使用泛型参数返回类型?谢谢

最佳答案

在您的第一个和第二个示例中,您将 ArrayList 转换为名为 L 的类型。根据通用约束,L 还必须实现 List 接口(interface)。因此,L 可能是 ArrayListLinkedListStackVector,或者一些您创建的其他实现 List 的类。

到目前为止还不错吧?

现在假设 L 是一个 ArrayList 表达式等价于:

(ArrayList) instance

显然这会起作用。

但是如果 LLinkedList 呢?

(LinkedList) instance

那是行不通的,因为你不能强制一个数组列表成为一个链表!它们是不同的数据结构!

那为什么第三个行得通呢?

在第三个示例中,您明确声明“我希望此 ArrayList 成为 List”。这是可行的,因为您要将 instance 转换为的类型是确定的。 ArrayList 实现了List,所以一定要兼容!

The Method will not compile as LinkedList is a subtype of List and this does not work without a cast.... Please explain, I only allow ArrayList in and no other subclass of List

嗯,是的,您只允许将 ArrayList 传递给该方法。但是该方法的返回类型是L。从泛型约束中,我们知道 L 可以是任何实现了 List 的类型。但是,您不能将 ArrayList 转换为任何通过强制转换实现 List 的类型。

关于java - 转换为通用类型 java(为什么未选中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40905465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com