如何使用Lambda参数为ArrayList实现toArray()方法?

4
我正在实现一个类。
class PairStringList extends ArrayList<String> {
...

@Override
    public <T> T[] toArray(T[] a) {
        return super.toArray(a);
    }
}

我已经为这个类编写了测试,它们使用了这样的声明:

assertArrayEquals(new String[]{}, list.toArray(String[]::new));

我看到他们在Lambda表达式中使用了toArray()方法作为参数。如何实现toArray()方法以正确运行测试?目前我的编译输出如下:

没有找到适合的toArray(String[]::new)方法 Java.util.Collection.toArray(T[])方法不适用 (无法推断出类型变量T (参数不匹配;数组不是一个函数接口))

有什么想法,该如何解决这个问题?

注意:我不能改变测试代码

感谢大家!问题已经解决。 问题是测试是用 Java 11 编写的,而我使用的是 Java 8。将 Java 更新到 11 版本后一切都可以构建和编译。


你的测试在我的电脑上编译并通过了。在测试中,变量list是什么类型? - knittl
你能否尝试一下一个空类 class PairStringList extends ArrayList<String> {} 是否已经通过了那个测试? - tevemadar
1个回答

2

这是一个不同的toArray()方法,你可以通过调用super来借用它:

@Override
public <T> T[] toArray(IntFunction<T[]> generator) {
  return super.toArray(generator);
}

甚至可以“借鉴”/lib/src.zip/java.base/util/Collection.java中的默认实现:
@Override
public <T> T[] toArray(IntFunction<T[]> generator) {
  return toArray(generator.apply(0));
}   

实际上,即使您没有实现任何内容,您的测试也可能会通过,因为ArrayList<String>超类已经提供了它们。


那里不需要使用@Override - Naman
@Naman @Override并不是必需的。它表示您想要覆盖现有方法,因此编译器可以在发生错误时告诉您,因为继承链与程序员所想的不同,甚至只是发生了一些打字错误。在这里确实覆盖了现有方法,整个事情都可以使用空类体来完成。我不确定OP真正希望做什么,但可能不是这些尝试(调用super而不做任何事情)。 - tevemadar
我是说,除非使用Java-11,否则toArray(IntFunction<T[]> generator)方法不会被覆盖,你分享的代码将无法编译。 - Naman
@Naman,好的,现在我明白你的担忧了。我无法确定他们正在使用哪个版本,但Java 8是唯一一个活跃的版本,并且不会覆盖此处现有的方法。 - tevemadar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接