我想更多地了解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的子类型。
请澄清
答案 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行出现错误的原因。