【问题标题】:Java generics extends and super implemented in collection and its subtypesJava 泛型在集合及其子类型中扩展和超级实现
【发布时间】: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


【解决方案1】:

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

class Emp<P1> extends Base<Object> {

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

用 P1 和 C 代替 T 是 ArrayList。 该代码中的任何内容都不需要 P1 实际实现 Collection。

需要调用 credit()。这就是为什么您在第 3 行出现错误的原因。

【讨论】:

    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2012-06-13
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多