我读过一些关于Java中的Covariance、Contravariance和Invariance的文章,但我对它们感到困惑.
我使用的是Java 11,我有一个类层次 struct A => B => C
(意味着C
是B
和A
的子类型,B
是A
的子类型)和一个类Container
:
class Container<T> {
public final T t;
public Container(T t) {
this.t = t;
}
}
例如,如果我定义了一个函数:
public Container<B> method(Container<B> param){
...
}
这是我的困惑,为什么第三行要编译?
method(new Container<>(new A())); // ERROR
method(new Container<>(new B())); // OK
method(new Container<>(new C())); // OK Why ?, I make a correction, this compiles OK
如果在Java中,泛型是invariant.
当我定义这样的东西时:
Container<B> conta = new Container<>(new A()); // ERROR, Its OK!
Container<B> contb = new Container<>(new B()); // OK, Its OK!
Container<B> contc = new Container<>(new C()); // Ok, why ? It's not valid, because they are invariant