函数和谓词参数模糊不清?

时间:2018-05-04 07:37:37

标签: java java-8 functional-programming

使用Java 8,我收到以下代码的编译错误:

public class Ambiguous {
    public static void call() {
        SomeDataClass data = new SomeDataClass();
        callee(data, SomeDataClass::getString);
        // compiler errors:
        // 1. at callee method name:
        // The method callee(SomeDataClass, Function<SomeDataClass,String>) is ambiguous for the type Ambiguous
        // 2. at lambda:
        // Type mismatch: cannot convert from boolean to String
        callee(data, d -> d.getRandom() > 0.5);
    }

    public static void callee(SomeDataClass data, Function<SomeDataClass, String> extractString) {
        System.out.println(extractString.apply(data));
    }

    public static void callee(SomeDataClass data, Predicate<SomeDataClass> check) {
        System.out.println(check.test(data));
    }
}

// token data class
final class SomeDataClass {
    public String getString() {
        return "string";
    }

    public final double getRandom() {
        return Math.random();
    }
}

基本上编译器说“我知道你返回boolean但你不应该,如果你不这样做,我不知道使用什么方法”而不是“哦你回来了{{ 1}},你必须指的是方法的boolean版本“?这种混乱是如何产生的?

我理解是否Predicate(所以他们有一个共同的类型)但事实并非如此。

我知道如何解决它;我做的很好

Predicate<T> extends Function<T, Boolean>

但我很好奇是什么导致它。

1 个答案:

答案 0 :(得分:0)

为清晰起见,可以简化一下:

public static void m(Predicate<Integer> predicate){

}

public static void m(Function<Integer, String> function){

}

用以下方式调用它:

m(i -> "test")

您认为会发生什么?与你的问题相同。

这里的编译器必须知道方法才能找到目标类型,但是需要知道目标类型才能解决方法(它就像死锁一样)。

当您向Predicate...添加强制转换时,您正在创建一个显式目标类型,根据我的理解,返回类型会被考虑用于方法重载。