2012-01-16 101 views
2

我有一个接口与方法泛型集合和方法返回类型

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; 

以避免错误。

有人可以解释我为什么吗?为什么如果所有对象都将每个默认对象设置为超类,我必须进行强制转换?

回答

7

一个List<MyObject>不是List<Object>.,否则你将能够把一个ObjectList<MyObject>

试试这个

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

您可以修改列表getLeftBusinessObjects()返回通过将任何物体输入Object即可。这会打破类型安全性,因为Helper.getMyObjects(businessObjectIds)返回的列表只能保存类型为MyObject的对象。

0

没有contravariance也没有协变在java中的泛型。

这样的:List<MyObject>不会扩展List<Object>

0

泛型用于对象的编译时间验证,我们添加到收藏。所以,你期望MyObject作为你的对象列表List<MyObject> myObjs,这意味着你只想添加这些对象。但是您将List<Object>指定为List<MyObject> myObjs,意味着List可以具有任何类对象,因此它打破了泛型的合约。因此,编译器会让开发人员决定将List<Object>指定为List<MyObject> myObjs是否安全,因为在运行时机会有ClassCastException