为什么在java中记录被认为是产品类型而类不是?

wln*_*ana 1 java oop type-theory record algebraic-data-types

Java 16 将正式提供记录功能据其中一位作者称,这是一种产品类型。

我了解记录的内部状态范围来自由成员字段构建的笛卡尔积空间,因此是产品类型的一个示例。但这与传统的 OOP 类不一样吗?为什么程序员很少将类视为产品类型的示例?

(其实我倾向于觉得,有了继承,超类对于它的子类也是一种弱求和类型。)

Ste*_*n C 5

从类型理论的角度来看,笛卡尔积类型是一组由各个“字段”类型的值组成的元组。它不允许突变。Java 14+record类型是不可变的,因此record和笛卡尔积类型之间有很好的匹配。

从同样的角度来看,对象类型必须允许突变。然而,经典类型理论不允许(数学)值发生变异。这意味着必须将对象类型建模为一组函数(lambda 表达式),这些函数从对象的一个​​状态映射到下一个状态。

(相同的方法用于在纯函数式语言中对变异进行建模。变异是通过从先前的状态/环境/上下文创建新状态/环境/上下文来建模的。)

所以 ....

但这与传统的 OOP 类不一样吗?

不; 看上面。

为什么程序员很少将类视为产品类型的示例?

嗯,基本上是因为他们这样做是错误的。

类型论不是一个见仁见智的问题。它是数学。一个数学命题要么可证明是正确的,要么不正确。为 as 编程语言提出的类型理论要么可证明是正确的(在某些约束内)要么不正确。任何不支持变异的面向对象类型理论都明显是错误的,因为对象状态的变异是面向对象的核心。

有很好的类型论教科书。如果你真的想了解这些东西,你应该买一本并阅读它。