我正在尝试这样做:
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)
答案 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)