泛型集合和方法返回类型

时间:2012-01-16 11:13:32

标签: java generics

我有一个方法

的界面
public List< Object > getLeftBusinessObjects( List< Object > businessObjectIds, Object owningSystemId );

我的实施是:

public List<Object> getLeftBusinessObjects(List< Object > businessObjectIds, Object owningSystemId)
{    
    List<MyObject> myObjs= Helper.getMyObjects(businessObjectIds);
    return myObjs;
}

这样做我收到错误:

Type mismatch: cannot convert from List<MyObject> to List<Object>

我必须以这种方式双击

return (List<Object>) (Object) myObjs;

避免错误。

有人可以解释我为什么吗?如果所有对象都具有每个dafault对象作为超类,为什么必须进行强制转换?

4 个答案:

答案 0 :(得分:7)

List<MyObject>不是List<Object>.,否则您可以将Object放入List<MyObject>

试试这个

public List<? extends Object> getLeftBusinessObjects(List< Object > businessObjectIds, Object owningSystemId)
{    
    List<MyObject> myObjs= Helper.getMyObjects(businessObjectIds);
    return myObjs;
}

答案 1 :(得分:0)

您可以通过向其添加getLeftBusinessObjects()类型的任何对象来修改Object返回的列表。这会打破类型安全性,因为Helper.getMyObjects(businessObjectIds)返回的列表只能保存MyObject类型的对象。

答案 2 :(得分:0)

java中的泛型中没有contravariance或协方差。

因此:List<MyObject>不会延伸List<Object>

答案 3 :(得分:0)

泛型用于对象的编译时验证,我们将其添加到集合中。因此,您期望MyObject作为列表List<MyObject> myObjs中的对象,这意味着您只想添加这些对象。但是你将List<Object>分配给List<MyObject> myObjs,意味着List可以有任何类对象,因此它违反了泛型的契约。因此,编译器允许开发人员决定将List<Object>分配给List<MyObject> myObjs是否安全,因为在运行时有ClassCastException的可能性。