问题描述
我有很多使用Lombok的Cannot drop asymmetric key 'key_clr_HTTP_Request' because there is a login mapped to it.
类,我想迁移所有这些类以使用Java 14中可用的新Record功能。
我知道还早一点,但这是我正在做的实验性测试。
这里的主要问题涉及继承。我有一个B类,它扩展了A类。是否可以通过继承使用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说明:
记录限制
记录不能扩展任何其他类,并且不能声明除与状态描述组件相对应的私有final字段以外的实例字段。声明的任何其他字段都必须是静态的。这些限制确保了状态描述独自定义了表示形式。
但是,它们可以实现接口并定义实例方法,因此您可以多态使用它们。此外,由于它们将继承默认方法,因此它们确实支持有限形式的继承。
这时,Java语言规范未指定记录构造及其语义。