我有一个方法
的界面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对象作为超类,为什么必须进行强制转换?
答案 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
的可能性。