我正在尝试使用泛型在Java中执行以下操作:
public class MyType {
public void printBase(Collection<Base> bases) {
for (Base base : bases) {
System.out.println(base.toString());
}
}
public <A extends Base> void myMethod(Collection<A> things) {
// ...
printBases(things); // Error here
// ...
}
}
我得到的错误是:
The method printBases(Collection<Base>) in the type MyType is not applicable for the arguments (Collection<A>).
但是,在这种情况下,A extends Base
所以A是基数。这种方法不应该合法吗?如果没有,我该如何解决这个问题?
答案 0 :(得分:4)
通用类型是不变的,因此Collection<Base>
使用的类型与Collection<A>
不兼容。您可以为bases
参数
public void printBase(Collection<? extends Base> bases) {
答案 1 :(得分:3)
Collection<A>
扩展Collection<Base>
, A
也不会延伸Base
。
所以在编译时看到这个错误是绝对正常的。
鉴于您无法更改printBase
的定义,以下是可能的解决方法。
import java.util.ArrayList;
import java.util.Collection;
class Base {
}
class A extends Base {
}
public class MyType {
public void printBase(Collection<Base> bases) {
for (Base base : bases) {
System.out.println(base.toString());
}
}
public <A extends Base> void myMethod(Collection<A> things) {
Collection<Base> lst = new ArrayList<Base>();
lst.addAll(things);
printBase(lst);
}
}