gpt4 book ai didi

java - Java 参数化列表中的类型转换

转载 作者:行者123 更新时间:2023-11-30 07:22:07 27 4
gpt4 key购买 nike

设置

我有两门课:

class A {

}

class B extends A {

}

以及 B 类型的列表:

List<B> listOfB = new ArrayList<>();

第 1 部分:目标

我实际上想要实现的是转换 listOfB 的类型来自BA 。继Java tutorial ,我假设正确的方法是:

List<? extends A> listOfB = new ArrayList<>();
listOfB.add(new B()); // <--- Error here
List<A> listOfA = (List<A>) listOfB;

但是,这不允许我添加 A 类的对象或BlistOfB 。我得到的错误是:

add (capture <? extends A>) in List cannot be applied to (B)

因此,我目前正在采用以下方法(效果非常好):

List<A> listOfA = new ArrayList<A>(listOfB);

第 2 部分:效率

显然有一些不太好的方法可以做到这一点( link )以及 Java 教程中推荐的方法( link )。

那么用 List<? extends A> 实现这一目标的正确方法是什么? ?

我想知道上述方法的性能损失/增益。构造函数是否迭代思考listOfB进行类型转换?如果是这样,当列表变大时,这是否会影响性能(与第 1 部分中的直接类型转换相比)?

最佳答案

当你写List <? extends A>时含义是扩展 A 的一些未知类型元素驻留在列表中,并且仅驻留在该类型的元素中。您无法对元素的具体类型做出任何假设,因此您无法将 B 添加到列表中。由于编译器不知 Prop 体类型,您将无法添加任何内容。

当您定义 List <B> 时,由于List在java中是协变的,这意味着即使B扩展了A,List <B>不扩展 List <A> !这是有道理的:如果你能做到这一点,那么看看这个例子:String 扩展了 Object 对吗?那么你可以这样做:

List <String> a = new List <>();
a.add ("bla");
List <Object> asObj = a;
asObj.add (1);

如果你尝试迭代 a,你认为你得到了一个字符串列表,但你会得到一个 ClassCastException!

那么,问题是为什么不将您的列表定义为“As 列表”?

转换不涉及构造函数迭代。编译器只是在运行前用具体类型替换类型删除。

关于java - Java 参数化列表中的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37383472/

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