Java泛型在集合及其子类型中扩展和超级实现

时间:2016-06-20 09:54:18

标签: java generics collections extend covariance

我想更多地了解java泛型协方差和逆变,以及如何扩展和超级一起工作w.r.t集合和单个对象

class P1 {}

class P2 implements Collection<P2> { // implement collection methods }

class Base<T> {
transient List<T> _instList = new ArrayList<>();

protected Base(final List<T> list) {
    _instList = list;
}
}

@SuppressWarnings("unchecked")
class Emp<T> extends Base<Object> {

public <C extends Collection<T>> Emp(final List<? super C> list) {
    super((List<Object>) list);
}

public <C extends Collection<T>> void salary(C c) {

}

public <C extends Collection<? super T>> void credit(C c) {

}
}

在Main方法中,

1 Emp<P1> emp1 = new Emp<>(new ArrayList<P1>());// works, compiles fine
2 Emp<P2> emp2 = new Emp<>(new ArrayList<P2>());// works, compiles fine
3 emp1.credit(new P1()); // doesn't compile
4 emp2.credit(new P2()); // works 

我想了解&amp;当P1不是一种集合

时,为什么第1行有效

2&amp; 4确实编译,因为P2是Collection的子类型。

请澄清

1 个答案:

答案 0 :(得分:0)

第1行匹配构造函数的类型绑定。

class Emp<P1> extends Base<Object> {

    public <C extends Collection<P1>> Emp(final List<? super C> list) {
        super((List<Object>) list);
    }

用P1替换T,C是ArrayList。 该代码中没有任何内容要求P1实际实现Collection。

需要致电credit()。这就是你在第3行出现错误的原因。