协变
如果A是B的子类型,那么List<A> 就是 List<B> 的子类型。这样的类或者接口被称为协变的
。
out
类型参数 T 上的关键字 out 有两层含义:
- 子类型化会被保留(Producer<Cat> 是 Producer<Animal> 的子类型)
- T 只能用在 out 位置
==注意==:
- 构造方法的参数既不在 in 位置,也不在 out 位置。即使类型参数声明成了 out,仍然可以在构造方法参数的声明中使用它。
- 如果把类型的实例当成一个更泛化的类型的实例使用,变型会防止该实例被误用:不能调用存在潜在危险的方法。构造方法不是那种在实例创建之后还能调用的方法,因此它不会存在潜在的危险。
- 位置规则值覆盖了类外部可见的(public、protected 和 internal)API。私有方法的参数既不在in 位置也不在 out 位置。变型规则只会防止 外部使用者对类的误用但不会对类自己的实现起作用。
网友评论