首页 > 解决方案 > 如何使用 Lambda 参数为 ArrayList 实现 toArray() 方法?

问题描述

我正在实施课程

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(String[]::new) 方法找到合适的方法 Java.util.Collection.toArray(T[]) 不适用(无法推断类型变量 T(参数不匹配;数组不是功能接口))

任何想法,我该如何解决这个问题?

注意:我无法更改测试代码

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

标签: javalambda

解决方案


这是一种不同的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>超类无论如何都提供了它们。


推荐阅读