gpt4 book ai didi

java - Collection 转换为 SuperCollection

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

在 Java 中,可以将类 B 的实例转换为类 A 的实例,前提是 B 扩展 A.

这也可以用于类型参数化的类吗?例如,对于扩展 AB,我想执行以下操作:

List<A> l = new ArrayList<B>();

我认为这应该是合法的,但编译器在这一点上不同意我的看法,所以我用以下 hack 来欺骗它:

List<A> l = (List<A>)(List) new ArrayList<B>();

...但我认为我会被 velociraptor 击中.有没有一种优雅的方式来做到这一点?

最佳答案

I think this should be legal, but the compiler doesn't agree with me on this point

通常,当人类和编译器意见不一致时,站在编译器一边是安全的。不要欺骗编译器,您应该首先了解为什么它不允许转换。

考虑一下:你做了一个 List<B> ,像这样:

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

到目前为止,每个人都很开心。现在让我们做你认为正确的事情:

// This does not compile, but let's pretend that it does
List<A> listA = (List<A>)listB;

此时,我们有listA那完全是我们的!让我们玩一下:假设我们有另一个类 C扩展A .我们可以这样做吗?

listA.add(new C()); // Why not? The compiler should allow it!

等等,你看到我们做了什么了吗?我们的listB包含 C现在!这就是编译器不允许转换的原因;这也是为什么在您尝试向列表中添加任何内容时您的代码不安全的原因。

要解决此问题,您可以使用通配符:List<? extends A> .但是,这会将您的列表限制为只读访问。如果您必须允许写入(并且您知道您将只设置正确的内容),请使用非通用 List相反。

关于java - Collection<Sub> 转换为 SuperCollection<Super>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13100051/

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