扩展List及其通用

时间:2013-10-25 11:58:33

标签: java list generics extend

我正在尝试这样做:

public class MyClass1 implements IMyInterface{
    public boolean myMethod(){
        ...
    }
}
public class MyClass2 implements IMyInterface{
    public boolean myMethod(){
        ...
    }
}
public class MyList<T extends IMyInterface> extends ArrayList<T>{
    public T getSomething(){
        for (int i = 0; i < size(); i++) {
            if (get(i).myMethod())
                return get(i);
        }
        return null;
    }
}

所以我可以像这样使用它

public class MyClass3{
    public void doSomething(MyList<IMyInterface> list){
        ...
    }
}
public class MyClass4{
    public MyList<MyClass1> list1;
    public MyList<MyClass2> list2;

    public MyClass4(){
        MyClass3.doSomething(list1);
        MyClass3.doSomething(list2);
    }
}

但我收到此消息的错误:MyClass3类型中的方法doSomething(MyList)不适用于参数(MyList)

3 个答案:

答案 0 :(得分:1)

您需要使用wilcards

doSomething(MyList<IMyInterface> list)更改为doSomething(MyList<? extends IMyInterface> list)

答案 1 :(得分:1)

方法定义

public void doSomething(MyList<IMyInterface> list){
        ...
}

表示它只会接受MyList类型的IMyInterface。您无法将MyList类型MyClass1 or MyClass2传递给它。 MyList<MyClass1>是原始类型MyList的子类型,但不是参数化类型MyList<IMyInterface>的子类型。

您需要使用bounded wildcard type来处理此类情况。您需要使参数接受MyList类型IMyInterface or some subtype of IMyInterface。因此,为了使其工作,请将doSomething的方法参数更改为此;

public void doSomething(MyList<? extends IMyInterface> list){
...
}

答案 2 :(得分:0)

此签名:

public void doSomething(MyList<IMyInterface> list)
只要arg是MyList IMyInterface

就会匹配。 但是在您的代码中,您尝试使用MyList MyClass1来调用它,这是不一样的。

修改签名,使其与MyList的所有IMyInterface以及MyList的所有IMyInterface子类匹配。要做到这一点,你必须使用这样的上限widcard:

public void doSomething(MyList<? extends IMyInterface> list)