我正在用java编写一段代码,想要封装我的对象并只返回接口。
现在简而言之这是我的问题我有一个包含列表的类,我有一个返回List的getter。如何返回界面列表?
没有收到此错误警告:
列表是原始类型。对泛型类型List的引用应该参数化
为了让你清楚地了解这段代码是我问题的一个例子:
public class Employee{
private List<MyObject> myObjects;
public List<MyInterface> getMyObjects(){
return myObjects;
}
}
MyObject实现MyInterface并返回myObjects会产生问题。
提前致谢。
答案 0 :(得分:2)
如果MyObject
实施MyInterface
,您可以将返回类型更改为List<? extends MyInterface>
。
class Employee{
private List<MyObject> myObjects;
public List<? extends MyInterface> getMyObjects(){
return myObjects;
}
}
请注意,在这种情况下,编译器不允许您在返回的列表上调用add(...)
,除非您在此处进行投射。但是,由于您只返回接口,我猜您不打算在返回的列表中添加任何内容,因此您应该没问题。
答案 1 :(得分:1)
只需声明您的界面列表作为实例变量。
private List<MyInterface> myObjects;
答案 2 :(得分:1)
我只需按照您需要的方式定义实例属性:
public class Employee{
private List<MyInterface> myObjects;
public List<MyInterface> getMyObjects(){
return myObjects;
}
}
答案 3 :(得分:1)
即使MyObject
实施MyInterface
,List<MyObject>
延伸List<MyInterface>
也 为真 - 有关详细信息,请参阅this excellent document 。为了通知编译器您的意图,请指定方法签名,如下所示:
public List<? extends MyInterface> getMyObjects{
...
答案 4 :(得分:0)
使用 checkedCollection(集合c,类类型)
http://download.oracle.com/javase/1,5.0/docs/api/java/util/Collections.html#checkedCollection(java.util.Collection,java.lang.Class)
答案 5 :(得分:0)
您无法将List<MyObject>
投射到List<MyInterface>
。因此,请尝试将myObjects
定义为List<MyInterface>
或使用以下内容:
public class Employee{
private List<MyObject> myObjects;
public List<MyInterface> getMyObjects(){
List<MyInterface> result = new ArrayList<MyInterface>(myObjects.size());
result.addAll(result);
return result;
}
}