【问题标题】:Why can't I use different generic Lists with Java record constructors为什么我不能将不同的通用列表与 Java 记录构造函数一起使用
【发布时间】:2023-01-13 18:29:33
【问题描述】:

根据JEP 395,可以使用带有附加构造函数的记录:

public record Aliases(List<String> value) {    
    public Aliases(Integer raw) {
        this(List.of(raw.toString()));
    }    
}

或者将多个值作为数组:

public record Aliases(List<String> value) {

    public Aliases(Integer... raws) {
        this(Arrays.stream(raws).map(Object::toString).toList());
    }

}

使用类型列表不起作用的地方:

public record Aliases(List<String> value) {

    public Aliases(List<Integer> rawList) {
        this(rawList.stream().map(Object::toString).toList());
    }

}

它说

错误:记录别名中的无效规范构造函数

我想了解背后发生的事情以及为什么它不起作用?

【问题讨论】:

标签: java generics java-record


【解决方案1】:

在 JEP 395 中,记录作为一种新型类在 Java 14 中引入,它是一种表示简单数据的简洁且不可变的方式。记录具有紧凑的语法,旨在易于使用和理解,同时还提供高级别的类型安全性。

出现错误“记录别名中的无效规范构造函数”是因为您提供的以整数列表作为参数的构造函数不是“规范”构造函数。 “规范”构造函数是一种特殊的构造函数,由编译器自动生成,用于初始化记录的状态。

在这种情况下,编译器期望规范构造函数具有与记录组件相同的签名,在您的情况下是别名(列表值)。相反,您提供了一个将 List 作为参数的构造函数。编译器认为这不是有效的规范构造函数。

或者,您可以使用接收整数数组并将其映射到字符串列表的方法,该方法也可以正常工作。

看起来,您可以在记录中使用其他构造函数,只要它们使用与规范构造函数相同类型的组件来初始化记录的状态即可。

还值得注意的是,Java Records 旨在用于简单的数据类,而不是用于可能需要更高级功能的复杂类。

【讨论】:

  • 您忘记了“chatgpt 版权所有”的备注。
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 2019-03-06
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
相关资源
最近更新 更多