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 Substitution Principle,因为类型box2
的{{1}}可以在需要类型Box<Cat>
的位置使用,我可以说:
Box<? extends Animal>
实际上:我甚至不确定Box<Cat> is subtype of Box<? extends Animal>
和Box<? extends Animal>
是否类型
答案 0 :(得分:5)
给定泛型类型声明
C<F1,...,Fn>
(n> 0),直接 参数化类型C<T1,...,Tn>
的超类型,其中Ti (1 ≤ i ≤ n)
是一种类型,具有以下所有类型:
- [...]
C<S1,...,Sn>
,其中Si
包含Ti (1 ≤ i ≤ n)
(§4.5.1)。
和about containing described above
类型参数
T1
据说包含另一个类型参数T2
, 写T2 <= T1
,如果T2
表示的类型集可证明是a 在{strong>反身和下由T1
表示的类型集的子集 传递闭包以下规则(其中<:
表示子类型 (§4.10)):? extends T <= ? extends S if T <: S ? extends T <= ? T <= T T <= ? extends T [...] // see these if you are interested
在你的情况下,
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>
的子类型。