有什么方法可以通过继承使用 Records 吗?
Is there any way of using Records with inheritance?
我有一堆 @Data
classes 使用 Lombok,我想迁移所有这些以使用 Java 14 中可用的新记录功能。
我知道它有点早,但这是我正在进行的实验性测试。
这里的主要问题是涉及到继承。我有一个 class B,它扩展了一个 class A。有什么方法可以通过继承来使用 Records?
Is there any way of using records with inheritance?
记录已经扩展 java.lang.Record
。由于 Java 不允许多重继承,记录不能扩展任何其他 class.
例如,考虑以下记录 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 指出:
Restrictions on records
Records cannot extend any other class, and cannot declare instance fields other than the private final fields which correspond to components of the state description. Any other fields which are declared must be static. These restrictions ensure that the state description alone defines the representation.
但是,它们可以实现接口并定义实例方法,因此您可以多态地使用它们。此外,由于它们将继承默认方法,因此它们支持有限形式的继承。
此时,Java 语言规范未指定记录构造及其语义。
我有一堆 @Data
classes 使用 Lombok,我想迁移所有这些以使用 Java 14 中可用的新记录功能。
我知道它有点早,但这是我正在进行的实验性测试。
这里的主要问题是涉及到继承。我有一个 class B,它扩展了一个 class A。有什么方法可以通过继承来使用 Records?
Is there any way of using records with inheritance?
记录已经扩展 java.lang.Record
。由于 Java 不允许多重继承,记录不能扩展任何其他 class.
例如,考虑以下记录 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 指出:
Restrictions on records
Records cannot extend any other class, and cannot declare instance fields other than the private final fields which correspond to components of the state description. Any other fields which are declared must be static. These restrictions ensure that the state description alone defines the representation.
但是,它们可以实现接口并定义实例方法,因此您可以多态地使用它们。此外,由于它们将继承默认方法,因此它们支持有限形式的继承。
此时,Java 语言规范未指定记录构造及其语义。