如果为ArrayList<Interface>定义了java方法,则无法将其应用于ArrayList<ObjectImplementsInterface>
我有各种名为Gold
、Iron
等的对象。所有这些对象都实现了接口Metal
。
因为我必须对所有这些对象执行相同类型的操作,所以我定义了我的方法来接受ArrayList<Metal>
,以避免冗余代码
比如说
public ArrayList<Metal> doSomething(ArrayList<Metal> list){
...
}
但是如果你试着做类似的事情
ArrayList<Iron> inputList;
ArrayList<Iron> result=doSomething(inputList);
我得到错误:doSomething
不能应用于ArrayList<Iron>
如果不编写对每种对象类型执行相同操作的冗余方法,我如何解决这个问题
编辑
下面是根据用户建议编辑的方法示例
public static <T extends Metal> List<T> addMoleculaInMetalList(ArrayList<? extends Metal> list, Molecula t) {
Metal ma;
ArrayList<Molecula> moleculist;
for (int i = 0; i < list.size(); i++) {
ma = list.get(i);
if (ma.getName().equals(t.getDestinationName())) {
moleculist = ma.getMoleculas();
moleculist.add(t);
ma.setMoleculas(moleculist);
list.set(i, ma);
return list;
}
}
return list;
}
但这不管用,明白吗
-错误不能在中应用
list.set(i, ma);
及
-在return
上出现错误不兼容类型
# 1 楼答案
一个
ArrayList<Iron>
不是一个ArrayList<Metal>
,即使一个Iron
是一个Metal
。将方法签名更改为:最好使用接口
List
作为参数和返回类型,而不是具体的ArrayList
。如果您决定将来使用LinkedList
,则无需更改方法签名当您传入一个
ArrayList<Iron>
时,是否有理由需要得到一个List<Iron>
而不是一个List<Metal>
返回如果不是,则调用如下方法
如果是这样,那么您需要将方法签名设置为
现在,当您调用它时,参数和返回类型必须匹配
# 2 楼答案
将方法签名更改为
这样,您就有了一个方法,它接受
<T extends Metal>
的列表,并返回相同内容的列表(T
)