【问题标题】:How to implement toArray() method for ArrayList with Lambda parameter?如何使用 Lambda 参数为 ArrayList 实现 toArray() 方法?
【发布时间】:2021-08-12 04:10:49
【问题描述】:

我正在实施课程

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 后,一切都可以构建和编译

【问题讨论】:

  • 您的测试为我编译并通过。测试中你的变量list是什么类型的?
  • 如果一个空班 class PairStringList extends ArrayList&lt;String&gt; {} 已经通过了测试,你能试试吗?

标签: java lambda


【解决方案1】:

这是一个不同的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&lt;String&gt; 超类无论如何都提供了它们。

【讨论】:

  • @Override 在那里不需要。
  • @Naman @Override 从来都不是必需的。它表明你想覆盖一个现有的方法,所以编译器可以告诉你什么时候它没有发生,因为继承链与程序员的想法不同,甚至只是发生了一些错字。这里确实覆盖了现有方法,整个事情都可以使用空的类体。我不确定 OP 真正期望做什么,但可能不是这些尝试(调用 super 而不做任何事情)
  • 我的意思是除非在 Java-11 上,否则 toArray(IntFunction&lt;T[]&gt; generator) 不会被覆盖,并且您共享的代码不会编译。
  • @Naman 啊,好的,现在我明白你的担心了。我真的不知道他们使用的是什么版本,但 Java 8 是唯一一个还活着并且不会覆盖现有方法的版本。
猜你喜欢
  • 2015-11-10
  • 2013-03-28
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 2014-10-20
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多