【发布时间】:2016-10-21 12:40:23
【问题描述】:
我想进一步了解 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
我想了解当 P1 不是 Collection 类型时第 1 行如何以及为什么工作
2 & 4 确实可以编译,因为 P2 是 Collection 的子类型。
请澄清
【问题讨论】:
-
line1可以编译,为什么line2不行?换句话说,当line2无法编译时,它是如何编译line1的?
-
您的示例缺少详细信息,例如
Person是什么? -
更正了问题
标签: java generics collections extend covariance