是`Box <!>的子框'< - > - ?扩展Animal - >`?</cat>

时间:2014-06-24 22:04:42

标签: java generics type-systems

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>是否类型

1 个答案:

答案 0 :(得分:5)

Java Language Specification

  

给定泛型类型声明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>的子类型。