gpt4 book ai didi

java - Java 是否有任何计划添加泛型集合协变性?

转载 作者:行者123 更新时间:2023-12-03 19:30:03 28 4
gpt4 key购买 nike

我正在尝试编写一些如下所示的代码:

public List<IObject> getObject(){
ArrayList<ConcreteObject> objects = new ArrayList<ConcreteObject>();
return objects;
}

(其中 ConcreteObject 实现 IObject)

这根本行不通。它给出了编译器错误。 Java 有计划在未来支持这个吗?在那之前最好的解决方法是什么?我最终做的是:

public List<IObject> getObject(){
List<IObject> objects = new ArrayList<IObject>();
return objects;
}

这是可行的,而且这样做可能真的没有任何不良副作用。这是公认的最佳方法吗?

最佳答案

Java 已经支持这个特性,你只需要使用它。有关入门,请阅读 Wildcards tutorial来自 Sun。

你想要的是:

public List<? extends IObject> getObject(){
ArrayList<ConcreteObject> objects = new ArrayList<ConcreteObject>();
return objects;
}

或者,可以使用不安全的转换:

public <T extends IObject> List<T> getObject(){
ArrayList<T> objects = (ArrayList<T>) new ArrayList<ConcreteObject>();
return objects;
}

...但是此方法相当脆弱,当您尝试访问其具有无效类型的元素时会抛出运行时异常(除了发出编译错误信号):

@SuppressWarnings("unchecked")
public <T extends IObject> List<T> getObject(){
ArrayList<T> objects = (ArrayList<T>) new ArrayList<ConcreteObject>();
objects.add(new ConcreteObject());
return objects;
}


List<OtherConcreteObject> objects = getObject(); // Works.
OtherConcreteObject obj = OtherConcreteObject.get(0); // Throws CCE.

这将在运行时导致以下 ClassCastException:“ConcreteObject cannot be cast to OtherConcreteObject”——这是相当糟糕的,因为作为代码位于上方,它应该成功。

因此,您应该尽量避免使用这种方法。

关于java - Java 是否有任何计划添加泛型集合协变性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1751275/

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