给出以下代码:
public static void main(String[] args) {
record Foo(int[] ints){}
var ints = new int[]{1, 2};
var foo = new Foo(ints);
System.out.println(foo); // Foo[ints=[I@6433a2]
System.out.println(new Foo(new int[]{1,2}).equals(new Foo(new int[]{1,2}))); // false
System.out.println(new Foo(ints).equals(new Foo(ints))); //true
System.out.println(foo.equals(foo)); // true
}
看来,很明显,该阵列的toString
,equals
方法是使用(而不是静态方法,Arrays::equals
,Arrays::deepEquals
或Array::toString
)。
所以我想Java 14 Records(JEP 359)在数组上不能很好地工作,相应的方法必须由IDE生成(至少在IntelliJ中,默认情况下会生成“有用的”方法,即它们使用静态方法)在Arrays
)。
还是有其他解决方案?
toString()
,equals()
和hashCode()
记录的方法来实现使用invokedynamic参考。。如果仅当量的编译类等效项可以更接近该方法Arrays.deepToString
在其私有重载方法中所做的工作,那么它可能已经解决了原始情况。
invokedynamic
的选择与语义的选择完全无关;indy在这里是纯实现细节。编译器可能发出了字节码来执行相同的操作;这只是一种更有效,更灵活的方法。在记录的设计过程中,是否使用更细微的相等语义(例如数组的深度相等)进行了广泛的讨论,但是事实证明,这会导致更多的问题。
List
而不是数组?