我想知道通常是否有可能统一继承和参数多态性(“泛型”)的概念,特别是在方差方面,但在他们必须如何(“语法”)和在哪里(使用站点/声明站点)方面被定义?
考虑这个观点:
- 子类型例如
S <: T
可以被视为协变行为,因为接受的输入参数T
也将接受S
。 - 将“继承模型的方差”更改为不变量只能在定义方面通过禁止子类型(例如
final
,在类定义中添加修饰符)来实现,据我在大多数情况下所见,逆变是不可能的 - 参数多态性在默认情况下是不变的,但可以使其成为协变/反变
考虑到两者之间似乎存在不可忽略的概念不匹配
String[] <: Object[]
允许“不安全”协变(例如在 Java/C# 中)所产生的痛苦语言- 与继承相比,如何声明和使用继承/参数多态性的差异
在某些语言中,可以看出两者可以很好地协同工作,例如
class Foo extends Ordered[Foo]
实现排序/比较行为。
- 是否可以想象继承和参数多态性的概念可以统一并获得相同的默认方差行为(例如默认协方差,或者这会导致需要用不变性注释标记大多数类型,因此只是将丑陋移到另一个点)? 这是否更实用,就好像数据结构在默认情况下也会变得不可变一样?
- 是否有一个正式的系统被证明是合理的?
- 无论具体的编程语言如何,最有可能需要哪些语法选项/更改?
- 是否有一些工作示例或语言已经可以使用此/类似的东西?