有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如果为ArrayList<Interface>定义了java方法,则无法将其应用于ArrayList<ObjectImplementsInterface>

我有各种名为GoldIron等的对象。所有这些对象都实现了接口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上出现错误不兼容类型


共 (2) 个答案

  1. # 1 楼答案

    一个ArrayList<Iron>不是一个ArrayList<Metal>,即使一个Iron是一个Metal。将方法签名更改为:

    public List<Metal> doSomething(List<? extends Metal> list)
    

    最好使用接口List作为参数和返回类型,而不是具体的ArrayList。如果您决定将来使用LinkedList,则无需更改方法签名

    当您传入一个ArrayList<Iron>时,是否有理由需要得到一个List<Iron>而不是一个List<Metal>返回

    如果不是,则调用如下方法

    List<Metal> result = doSomething(inputList);
    

    如果是这样,那么您需要将方法签名设置为

    public <T extends Metal> List<T> doSomething(List<T> list)
    

    现在,当您调用它时,参数和返回类型必须匹配

  2. # 2 楼答案

    将方法签名更改为

    public <T extends Metal> List<T> doSomething(List<T> list)
    

    这样,您就有了一个方法,它接受<T extends Metal>的列表,并返回相同内容的列表(T