0

我正在尝试做这样的事情:

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)

4

3 回答 3

1

方法定义

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

说它只会接受MyListtype IMyInterface。您不能将它传递给MyListtype MyClass1 or MyClass2MyList<MyClass1>是原始类型的子类型MyList,但不是参数化类型的子类型MyList<IMyInterface>

你需要使用bounded wildcard type来处理这样的情况。您需要使参数接受MyListtype IMyInterface or some subtype of IMyInterface。所以为了让它工作,把方法参数改成doSomething这个;

public void doSomething(MyList<? extends IMyInterface> list){
...
}
于 2013-10-25T12:21:44.963 回答
1

你需要使用通配符

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

于 2013-10-25T12:12:58.543 回答
0

这个签名:

public void doSomething(MyList<IMyInterface> list)

只要 arg 是 a MyListof就会匹配IMyInterface。但是在您的代码中,您尝试使用MyListof来调用它,MyClass1这不一样。

修改签名,使其匹配 . 的所有MyList以及IMyInterface所有MyList子类型IMyInterface。为此,您必须使用这样的上限widcard:

public void doSomething(MyList<? extends IMyInterface> list)
于 2013-10-25T12:26:16.390 回答