【发布时间】:2014-03-13 11:59:46
【问题描述】:
要求:
- 需要我的方法返回两个指定对象之一的列表。
- 需要将上述方法的结果存储为两个指定对象之一的列表。
声明了一个基于通配符返回通用列表的方法。 声明部分正确,但方法调用失败。
class Z{/*TemplateClass*/}
public class A extends Z{}
public class B extends Z{}
测试类:
public List<? extends Z> getGenericList(boolean test){
if(test){
List<A> aList = new ArrayList<A>();
aList.add(new A());
return aList;
}
else{
List<B> bList = new ArrayList<B>();
bList.add(new B());
return bList;
}
}
这是我的要求。我需要类似下面的代码。
List<A> testAList = getGenericList(true);
List<B> testBList = getGenericList(false);
给我一个编译器错误。
类型不匹配:无法从 List 扩展到 List 类型不匹配:无法从 List到列表
我理解这背后的逻辑。如果我们传递一个 false 并将返回的 B 列表存储为 A 列表,这是错误的。 但是当我使用下面的代码时:
List<? extends Z> testList = getGenericList(true);
它编译得很好。但这超出了我的目的。我无法访问 A 或 B 中的方法,因为 testList.get(index) 返回 Z 类型的对象,我希望在其中获得 A 或 B。
如果我的代码绝对错误,那么任何正确方向的指针都将不胜感激。
【问题讨论】:
-
你知道Type Erasure吗?为什么不返回
List<Z>? -
明白了。原始对象被保留。稍后使用 Z 和类型转换是解决方案之一。我想知道是否可以在没有铸造部分的情况下完成。
-
Z只是我使用的一个模板。它绝对是空的。我需要的所有逻辑/数据都将出现在A或B中。如果对象是Z,我将如何访问这些数据而不将其类型转换为A或B -
在 Z 中定义合约
-
您的 cmets 帮助我解决了我的问题。谢谢艾略特。
标签: java generics collections