当前位置: 首页 > 面试题库 >

函数和谓词参数不明确?

史良哲
2023-03-14
问题内容

使用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.ranhtml" target="_blank">dom();
    }
}

因此,基本上,编译器会说“我知道您会返回,boolean但您不应该返回,如果不知道,我不确定使用哪种方法”,而不是“哦,您将返回boolean,您必须指Predicate代该方法的版本”
?如何产生这种混乱?

我知道(如果Predicate<T> extends Function<T, Boolean>它们有一个通用的Type),但事实并非如此。

我确实知道如何解决它;如果我这样做很好

callee(data, (Predicate<SomeDataClass>) d -> d.getRandom() > 0.5);

但我很好奇是什么原因造成的。


问题答案:

为了清楚起见,可以对此进行一些简化:

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

}

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

}

并调用:

m(i -> "test")

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

此处的编译器必须知道方法才能找到目标类型,但是为了解析该方法,编译器需要知道目标类型(就像死锁一样)。

当您将强制转换添加到时Predicate...,您正在创建一个 显式目标类型 ,据我所知,方法的重载考虑了该 类型的 返回类型。



 类似资料:
  • 本文向大家介绍Java 8中的函数和谓词之间的区别,包括了Java 8中的函数和谓词之间的区别的使用技巧和注意事项,需要的朋友参考一下 Java 8中引入了Function和Predicate两种功能接口,以用Java实现功能编程。 函数接口用于进行转换,它可以接受一个参数并产生结果。另一方面,谓词也只能接受一个参数,但只能返回布尔值。用于测试条件。 序号 键 功能 谓词 1 基本的 它可以包含2

  • 我有几个谓词要放在一个列表中,这样我就可以调用stream()。我的列表中没有匹配()。我通过创建命名谓词成功地做到了这一点,但如何在数组中创建它们呢。asList()的参数列表? 下面是我要转换的工作代码: 我希望转换的结果是这样的: 或 (这两个都不正确) 在哪里可以指定条件的参数? 很抱歉,如果这本可以被命名为更好的,我总是与之斗争。

  • 我试图用一个CriteriaQuery在JPA/Hibernate中复制这个查询的结果。 daysBack值作为参数传入。 日志输出为:测量表的计数为:36 然而,表中只有6行,这向我表明正在生成某种自连接或交叉积来创建36的输出。我应该做什么不同的事情来获得正确的计数?

  • 问题内容: 我有以下代码: 将其转换为使用Java 8 的正确方法是什么? 当我尝试使用时,我遇到错误,因为不是。 问题答案: 您无法完全执行所需的操作-方法引用中不允许使用显式参数。 但是你可以… …创建一个方法,该方法返回一个布尔值并将其调用编码为: 这将允许您使用方法ref: …或者您可以定义一个变量来保存该函数: 这将允许您简单地传递变量 …或者您可以咖喱和结合上述两种方法(这绝对是过分的

  • 我有两个函数的重载,它们采用不同的s,当与的结果一起使用时,会导致后者的歧义问题。我不明白为什么只有这是模棱两可的。 将< code>int()与< code>bind函数一起使用时,我得到一个模糊错误 gcc-5.1错误(类似的还有clang) 然而,以下所有工作 查看构造函数 对我来说,任何在不同的类型上具有多个重载的函数都应该有歧义,但这只是绑定调用的问题。然后我想“也许有一些神奇的事情发生

  • 我不明白发生了什么事。我严格遵循所有的微软文档,事实上甚至不使用任何我自己的脚本/代码。首先,我按照他们的文档创建Python函数。成功了。https://docs.microsoft.com/en-us/azure/azure-functions/create-first-function-cli-python?tabs=azure-cli、cmd、browser使用命令行工具将Azure功能连