通用替代原则 - 如何管理原则的应用

时间:2016-05-06 10:41:26

标签: java generics

来自文本" Java Generics and Collections"通过Naftalin和Wadler,一段说明尽管Integer是Number的一个子类型,List< Integer>不是List< Number>。

的子类型

这可以防止人们使用多态方式引用传统上可能允许这样的语句的地方。

我的问题是,因为“替代原则”'在List< Integer>的情况下不适用和List< Number>,对原则的限制是否与类和特定类型(分配给泛型类型)组合的位置有关 - 在所有情况下和一般情况下 - (此处为&# 39; List< Integer>'例如)。在这种情况下,我在类似于' List< Integer>'而不是' List'或'< Integer>这样的语句中提到了替代概念。 ;' seperatley。

或者替代地,限制是通过某种机制定义的,该机制指定是否以及哪些类是子类型(因此何时何地应用),就像通过通常的扩展和实现机制那样。

基本上我不理解机制,在这种情况下,导致 被定义为适用或不适用。

非常感谢

1 个答案:

答案 0 :(得分:1)

如果我正确地理解了这个问题,在Java和您描述的情况下,Liskov替换原则不适用,因为List<Integer> 不是 {{{em>的子类型1}},但这是Likov替代原则的要求。

话虽如此,List<Number>List<Integer>之间的关系可以用covaraince and contravariance来描述,它可以对表达式进行建模,可以表述如下。

  

由于List<Number>Integer的子类型,这意味着Number的每个实现都可以用于Number,同样必须适用于实例化Integer的类型通用模板,但使用IntegerNumber作为类型参数。

但是,根据我的理解,这是一种不同的机制,也在this question中讨论了泛型。