为什么Java说这些类型不兼容?

时间:2015-07-22 19:55:15

标签: java java-8

这是我的代码:

private BiFunction<B,
        BiFunction<B, ? extends Object, B>,
        Function<? extends Object, B>>
        applyPartial = (b, m) -> (v) -> m.apply(b, v);

Java说:

  

File.java:[92,141]不兼容的类型:java.lang.Object无法转换为捕获#1的?扩展java.lang.Object

第141列是v中的 m.apply(b, v)

为什么不编译?

2 个答案:

答案 0 :(得分:3)

在这种情况下,您必须命名所需的类型来代替通配符捕获。 Java无法确保两次捕获转换都是等效的。

由于您无法在函数调用中创建泛型类型,因此您应该创建一个工厂函数来创建函数:

// Provided B is supplied as a class type
public <C> BiFunction<B, BiFunction<B, C, B>, Function<C, B>> createCurrier() {
    return (b, m) -> v -> m.apply(b, v);
}
// B is an explicit type parameter
public <B, C> BiFunction<B, BiFunction<B, C, B>, Function<C, B>> createCurrier() {
    return (b, m) -> v -> m.apply(b, v);
}

答案 1 :(得分:2)

您有两种不同的? extends Object,编译器无法确保它们是相同的。您需要对其进行命名以确保两个地方都具有相同的类型:

private BiFunction<B, BiFunction<B, C, B>, Function<C, B>> applyPartial =
   (b, m) -> (v) -> m.apply(b, v);