gpt4 book ai didi

java - 如何使用作为 List 返回的 List

转载 作者:行者123 更新时间:2023-12-03 08:12:43 24 4
gpt4 key购买 nike

我有一个返回 List<Super> 的方法.说 List<Super> myMethod();

调用该方法时,我想将返回的列表转换为 List<Sub> ,知道它的运行时类型将是 ListSub .

我知道List<Sub> subs = (List<Sub>) myMethod()不会工作,因为泛型是不变的。

然而,List<? super Sub> subs = myMethod()有效,编译时类型变为 List<Object> , 所以 subs.get(0).mySubMethod()行不通。

我最终得到的是我必须明确地将其转换为 ((Sub) subs.get(0)).mySubMethod()

如何在不对每个元素进行显式转换的情况下正确执行此操作?

最佳答案

最短的版本是:

List<Sub> subs = (List) myMethod();

List是“原始类型”;您可以从 List 转换到任何 List<...>没有 Actor 。

请注意,这是在以一种根本不正确的方式规避类型系统;该列表构建为 ArrayList<Super> (或类似的),所以欺骗编译器让你用 List<Sub> 类型的引用来引用它实际上是不正确的, 即使碰巧所有列表元素的类型都是 Sub . (上面 msandiford 的较长版本也是如此;它可能看起来对泛型更友好,但实际上它只是做同样根本不正确的事情的另一种方式。)

但是,由于类型删除,您通常可以摆脱它。


一种正确的方法是使方法本身通用:

<T extends Super> List<T> myMethod(final Class<T> clazz) {
final List<T> ret = Collections.checkedList(new ArrayList<T>(), clazz);
// ... add elements to ret ...
return ret;
}

关于java - 如何使用作为 List<Super> 返回的 List<Sub>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26900998/

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