gpt4 book ai didi

java接口(interface)泛型转换问题

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:42:48 24 4
gpt4 key购买 nike

类型 List 中的方法 add(capture#2-of ? extends IObject) 不适用于参数 (IDerived)

protected List<? extends IObject> getObjects()
{
List<? extends IObject> objects = new ArrayList<IObject>();
for (String id: item_ids)
{
IDerived object = (IDerived) readObject(id);
objects.add(object); #error
}
return objects;
}

interface IDerived extends interface IVersionedObject extends interface IObject

如果我将对象的类型更改为 List,那么错误就会消失,这没有任何意义,因为它必须对函数返回类型进行完全相同的转换。

最佳答案

试试这个:

protected <T extends IObject> List<T> getObjects() {
List<T> objects = new ArrayList<T>();
for (String id: item_ids)
{
T object = (T) readObject(id);
objects.add(object); // NO error
}
return objects;
}

编辑(简短说明):

这样,您的方法将适用于 IObject 的任何子类型(内部的列表和强制类型转换变得通用),并且将从调用者的期望中推断出返回类型(正如您显然预期的那样)。

根据评论,您现在可以通过以下方式调用 getObjects() 方法:

// This should only be used if readObject() behaves like
// getObjects() and is able to return any requested subtype.
// Otherwise, you'll get a ClassCastException when trying to get
// something from the derivedList in case readObject() put something
// else there (which is not a subtype of IDerived).
List<IDerived> derivedList = getObjects();

// This is the safe way to go in case you don't have
// full control over what readObject() returns.
// But if you're using it like this (all the time), you'd better
// return List<IObject> from getObjects() and get rid
// of generics.
List<? extends IObject> objectList1 = getObjects();
List<IObject> objectList2 = getObjects();

关于java接口(interface)泛型转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4901729/

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