having
class BaseClass implements IData ();
class ChildClassA() extends BaseClass;
class ChildClassB() extends BaseClass;
无法执行
List<BaseClass> aList = new ArrayList<ChildClassA>()
所以有一个:
List<? extends IData> aList
for pointint to either
ArrayList<ChildClassA>(),
or
ArrayList<ChildClassB>()
aList
是在运行时通过其他路由构建的,那部分代码有一个函数来获取aList
中的List<IData>
。问题是如果
List<? extends IData> aList
指向ArrayList<ChildClassA>()
或ArrayList<ChildClassB>()
,它是否可以执行类似以下的操作:ListData<IData> outputList = (List<IData>) aList
?(看起来这个方法可行,但不确定是否有更好的方法来分配泛型数组而不是强制转换。) 编辑:
List<IData> outputList
的输出仅供只读使用(不可变),不能对其进行插入/删除操作,它只能迭代IData以针对IData的实际内容作出反应。List<? extends IData> aList = new ArrayList<ChildClassA>();
ListData<IData> outputList = (List<IData>)aList
List<? extends IData> aList = new ArrayList<ChildClassB>();
ListData<IData> outputList = (List<IData>)aList
ChildClassA
,谢谢你的指出。 - Valentin RuanoList<? extends IData>
就足够好了。是什么阻止你使用通配符类型的列表变量呢? - Valentin RuanoList<? extends IData> aList
这一部分处于中心位置,它可能会在运行时被赋值为List<ChildClassA>
或者List<ChildClassB>
。而且它将用于调用其他库代码,这些代码只接受List<IData>
。因此需要找到一种方法将List<? extends T>
分配给List<T>
。再次强调,List<T>
将是只读的。 - lannyfList<IData>
的限制应该是你问题的一部分。我认为最直接的解决方案就是复制列表,除非有性能问题。除非是真正的问题(避免过早优化),否则不必担心内存或 CPU。如果您坚持避免复制,并且由于库不打算更改列表,您可以使用Collections.unmodifiableList(aList)
为实际列表提供一个安全代理... 实际上后者是最好的选择,因为它将返回一个List<IData>
!!! - Valentin Ruano