有没有办法使用带有继承的记录?

Fel*_*ati 2 java record

我有一堆@Data使用 Lombok的类,我想迁移所有类以使用 Java 14 中提供的新 Record 功能。

我知道这有点早,但这是我正在做的实验测试。

这里的主要问题是涉及继承。我有一个 B 类,它扩展了一个 A 类。有没有办法使用带有继承的 Records?

Ste*_*n C 65

JEP指出

对记录的限制

记录不能扩展任何其他类,并且不能声明除与状态描述的组件相对应的私有最终字段之外的实例字段。声明的任何其他字段都必须是静态的。这些限制确保状态描述单独定义表示。

Java 17 JLS 8.10注释1

声明record没有extends子句,因此不可能显式声明直接超类类型,即使是Record.

但是,arecord 可以 implement接口,因此您可以多态地使用它们。此外,由于记录将继承default它们实现的接口中的任何方法,因此它们确实支持有限形式的继承。


1 - 这是一个非规范的声明,但显然是正确的,因为RecordDeclaration的指定语法显然不允许extends使用。

  • 继承具有默认方法的接口听起来非常灵活/强大......我正要尝试一下...... (8认同)

cas*_*lin 6

有没有办法使用带有继承的记录?

记录已经扩展java.lang.Record。由于 Java 不允许多重继承,记录不能扩展任何其他类。

例如,考虑以下记录Point

public record Point(double x, double y) {}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法编译它:

javac --enable-preview -source 14 Point.java
Run Code Online (Sandbox Code Playgroud)

借助javap,您可以获得有关为 生成的代码的详细信息Point

javap -p Point
Run Code Online (Sandbox Code Playgroud)

输出将是:

javap -p Point
Run Code Online (Sandbox Code Playgroud)

  • 如果记录 Derived 扩展记录 Base 并且 Base 扩展“java.lang.Record”,则 Derived 会传递扩展 Record。不需要多重继承,这只是糟糕的语言设计,希望在未来的某个时候能够得到解决。 (3认同)