【发布时间】:2020-08-26 21:11:00
【问题描述】:
我有一堆使用 Lombok 的 @Data 类,我想迁移所有这些类以使用 Java 14 中提供的新记录功能。
我知道这有点早,但这是我正在进行的实验性测试。
这里的主要问题是涉及继承。我有一个扩展类 A 的 B 类。有什么方法可以使用带有继承的 Records 吗?
【问题讨论】:
我有一堆使用 Lombok 的 @Data 类,我想迁移所有这些类以使用 Java 14 中提供的新记录功能。
我知道这有点早,但这是我正在进行的实验性测试。
这里的主要问题是涉及继承。我有一个扩展类 A 的 B 类。有什么方法可以使用带有继承的 Records 吗?
【问题讨论】:
有没有办法通过继承来使用记录?
记录已扩展 java.lang.Record。由于 Java 不允许多重继承,记录不能扩展任何其他类。
例如,考虑以下记录Point:
public record Point(double x, double y) {}
你可以编译它:
javac --enable-preview -source 14 Point.java
在javap的帮助下,您可以了解为Point生成的代码的详细信息:
javap -p Point
输出将是:
Compiled from "Point.java"
public final class Point extends java.lang.Record {
private final double x;
private final double y;
public Point(double, double);
public java.lang.String toString();
public final int hashCode();
public final boolean equals(java.lang.Object);
public double x();
public double y();
}
【讨论】:
JEP 声明如下:
记录限制
记录不能扩展任何其他类,并且不能声明除对应于状态描述组件的私有最终字段之外的实例字段。声明的任何其他字段必须是静态的。这些限制确保状态描述单独定义表示。
但是,它们可以实现接口并定义实例方法,因此您可以多态地使用它们。此外,由于它们将继承默认方法,因此它们确实支持有限的继承形式。
此时,Java 语言规范并未指定记录构造及其语义。
【讨论】: