有界类型参数不能用于需要父类的接口

时间:2014-01-16 16:44:42

标签: java generics

我正在尝试使用泛型在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是基数。这种方法不应该合法吗?如果没有,我该如何解决这个问题?

2 个答案:

答案 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);
    }
}