Java代码:
class Animal {}
class Cat extends Animal {}
class Box<T> {}
public class Test {
public void hello(Box<? extends Animal> box) {}
}
Box<Animal> box1 = new Box<Animal>();
Box<Cat> box2 = new Box<Cat>();
new Test().hello(box1);
new Test().hello(box2);因为在需要类型Liskov代换原理的情况下,可以使用带有Box<Cat>类型的box2,我可以这样说:
Box<Cat> is subtype of Box<? extends Animal>
实际上:我甚至不确定Box<? extends Animal>和? extends Animal是否是类型
发布于 2014-06-24 22:59:07
Java语言规范态
给定泛型类型声明
C<F1,...,Fn>(n > 0),参数化类型C<T1,...,Tn>(其中Ti (1 ≤ i ≤ n)是类型)的直接超级类型如下:
C<S1,...,Sn>,其中Si包含Ti (1 ≤ i ≤ n) (§4.5.1)。和上文所述
类型参数
T1被称为包含另一种类型参数T2,写T2 <= T1,如果由T2表示的类型集可以证明是T1在以下规则的自反闭包和传递闭包下所表示的类型集的子集(其中<:表示子类型(§4.10)): ?扩展T <=?如果T <:s扩展S?扩展T <=?T <= T T <=?扩展T. //如果您感兴趣,请查看这些
在你的情况下
Box<Cat>我们关心Cat。有了以上所述,我们可以说? extends Cat包含Cat。然后我们可以说? extends Animal包含? extends Cat,因为Cat <: Animal。所以? extends Animal包含Cat。因此,Box<? extends Animal>是参数化类型Box<Cat>的直接超级类型。
因此,Box<Cat>是Box<? extends Animal>的一个子类型。
https://stackoverflow.com/questions/24397112
复制相似问题