为什么不使用自定义构造函数推断变量 arity 记录组件?
Why is the variable arity record component not inferred with custom constructor?
正在使用 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<>());
}
}
我想知道的是,当通过另一个自定义构造函数调用而没有提供任何用于初始化的组件时,如何推断出类似的构造函数。
这与变量arity无关。所有记录构造函数链必须在规范构造函数(可以使用紧凑形式指定)中“触底”,可变元数与否。这表现为每个 non-canonical 构造函数必须委托给另一个构造函数的要求;最终这意味着链条在规范中触底。
您可以通过以下方式修复错误的构造函数:
public Break(R record) {
this(record);
}
但是,您甚至不需要全部声明此构造函数,因为规范构造函数已经可以处理 new Break(r)
形式的调用。
正在使用 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<>());
}
}
我想知道的是,当通过另一个自定义构造函数调用而没有提供任何用于初始化的组件时,如何推断出类似的构造函数。
这与变量arity无关。所有记录构造函数链必须在规范构造函数(可以使用紧凑形式指定)中“触底”,可变元数与否。这表现为每个 non-canonical 构造函数必须委托给另一个构造函数的要求;最终这意味着链条在规范中触底。
您可以通过以下方式修复错误的构造函数:
public Break(R record) {
this(record);
}
但是,您甚至不需要全部声明此构造函数,因为规范构造函数已经可以处理 new Break(r)
形式的调用。