3

尝试一些带有record和记录组件的代码。我正在使用可变稀有组件,并在自定义构造函数上遇到编译时错误。

public record Break<R extends Record>(R record, String... notifications) {

    public Break(R record, String... notifications) {
        System.out.println("record: " + record + " and notifications: " + Arrays.toString(notifications));
        this.record = record;
        this.notifications = notifications;
    }

    // compile error: non canonical record constructor must delegate to another costructor
    public Break(R record) { 
        System.out.println("record: " + record);
        this.record = record;
    }

    public Break() {
        this(null); // this works 
        // actually intelliJ suggests it uses the constructor that is not compiling
    }


    public static void main(String[] args) {
        new Break<>(new Break<>());
    }
}

我很想了解的是,在没有为初始化提供任何组件的情况下,当通过另一个自定义构造函数调用类似的构造函数时,如何推断出类似的构造函数。

4

1 回答 1

7

这与可变数量无关。所有记录构造函数链都必须在规范构造函数(可以使用紧凑形式指定)中“自下而上”,变量数量与否。这表现为每个非规范构造函数必须委托给另一个构造函数的要求;最终这意味着链在规范中触底。

您可以使用以下方法修复错误的构造函数:

public Break(R record) {
    this(record);
}

但是,您甚至不需要全部声明此构造函数,因为规范构造函数new Break(r)已经可以处理表单的调用。

于 2020-09-30T15:30:43.160 回答