【问题标题】:Lambda overloaded methodLambda 重载方法
【发布时间】:2016-01-20 11:52:14
【问题描述】:

我是 lambda 和函数式接口的新手。我正在尝试使用 lambda 实现 RowListener 功能接口 (ActiveJDBC ORM),但出现编译器错误,我现在不知道为什么。

匿名类的旧样式如下所示:

db.find("some query", new RowListener() {
        @Override
        public boolean next(Map<String, Object> arg0) {
            // TODO Auto-generated method stub
            return false;
        }
    });

这是我想做的:

db.find("some query", map -> {
        // whatever
    });

给我的错误是:

Base类型中的find(String, Object...)方法不适用于参数(String, (map) -> {})

我认为它正在尝试将 lambda 应用于“find”的重载方法,该方法不接受 RowListener 作为参数,但我不确定为什么。

您能对此有所了解的任何信息都会有所帮助。

【问题讨论】:

  • RowListener 本身的代码在 lambda 案例中是什么样的?

标签: java lambda interface functional-programming java-8


【解决方案1】:

形式的 lambda 表达式

map -> {
        // whatever
    }

与功能签名不兼容。根据您的内部类示例代码,它必须返回一个 boolean 值。因此,它必须是

map -> {
        // whatever
        return false;
    }

map -> /* simple expression, e.g.: */ false

在重载方法的情况下,编译器使用 lambda 表达式的形状,即它是 value compatible 还是 void compatible(参见JLS §15.27.2)来确定哪些方法适用。

请记住,如果 lambda 的主体是包含条件代码的块,则所有可以正常完成的代码流都必须返回一个值。

由于 所有 方法都不适用,编译器会根据一种算法选择一个来报告错误,该算法与一个参数是 lambda 表达式这一事实无关。似乎它报告了 find(String, Object...) 方法,因为该方法可以使用大多数类型的参数。你可以说,如果没有 lambda 表达式,该方法可以消耗任何东西。

这可能是在考虑 lambda 表达式之前已经实现的编译器特定行为。然而,这只是错误报告行为,主要问题是 lambda 表达式不兼容 。修复它应该可以解决所有问题。

【讨论】:

    【解决方案2】:

    啊,错误信息让我很困惑。我添加了一个布尔返回值,它编译:)

    【讨论】:

      猜你喜欢
      • 2018-07-12
      • 2014-06-19
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多