Java:泛型函数引用的编译错误



有人可以帮我修复这个编译错误吗?

我想在名为 Suite 的通用接口中定义一个 map 方法,并像这样使用它:

Suite < Integer > suite2 = Suite.from("34", "78", "23").map(Integer::parseInt);
assertEquals(3, suite.size());
assertEquals(34, (int)suite.get(0));
assertEquals(78, (int)suite.get(1));
assertEquals(23, (int)suite.get(2));

使用函数和参数对同一方法的调用编译良好:

Suite<Integer> suite1 = Suite.from(1, 2).map(x -> x * 2);
assertEquals(2, suite.size());
assertEquals(2, (int)suite.get(0));
assertEquals(4, (int)suite.get(1));

所以我在界面中定义了这样的方法

public interface Suite<E> {
    public <E> Suite<E> map(int i, Function<? super E, ? extends E> f);
}

注意:这与 Stream 类的 map 方法几乎是相同的原型 (参数 i 除外(

我的问题在我的测试中,这一行无法编译:

map(Integer::parseInt)

由于这些错误:

  • Integer 类型未定义此处适用的toString(Object)
  • 类型不匹配:无法将Suite<Object>转换为Suite<String>

我试图用Supplier<E>重新定义函数,但它不起作用。

 Function<? super E, ? extends E> function

整数不是 String 的超类,因此此操作失败:

Suite <String> suite1 = Suite.span(1, Integer::toString);

参考:<?超级T>和<之间的区别?在Java中扩展T>

通常函数映射期望类型更改,例如参数和结果类型是不同的:

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#map-java.util.function.Function-

Suite

suite2 = Suite.from("34", "78", "23"(.map(Integer::p arseInt(;

在这里您将String类型更改为Integer,因此您不能使用通用E通用名称,例如

public <E> Suite<E> map(int i, Function<? super E, ? extends E> f);

但:

public <T, R> Suite<R> map(int i, Function<? super T, ? extends R> f);

或:

public interface Suite<E> {
    public <R> Suite<R> map(int i, Function<? super E, ? extends R> f);
}

最新更新