代码之家  ›  专栏  ›  技术社区  ›  Azeem Haider

Java中的新特性lambda重载[复制]

  •  0
  • Azeem Haider  · 技术社区  · 7 年前

    这个问题已经有了答案:

    我有点困惑为什么没有像lambda重载这样的东西。
    我知道lambda表达式与 @FunctionalInterface 如果在接口中有两个或多个抽象方法,则编译器无法决定使用lambda表达式时要调用的函数,因此如果要使用lambda表达式,则需要在接口中只有一个抽象方法。但是,如果有两个或多个函数具有不同的参数、不同类型的参数或返回类型,而编译器很容易决定要调用哪个函数,该怎么办?

    例如:

     interface Foo{
         void show(String message);
         void count(int number);
     }
    
     // Calling with lambda (Syntax is not correct)
     x -> "Example Message";  // It should need to call void show();
     x -> 7; // It should need to call void count();
    

    为什么这种东西在Java中是不可用的。这不是件好事吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Jon Skeet    7 年前

    您已经考虑了问题的一个方面——lambda表达式应该对应于哪个方法。你没有考虑到的是发生在所有人身上的事情 其他 接口中的方法。

    语言 能够 指定为使lambda表达式对应于一个方法,而所有其他方法 RuntimeException -但这很少有用。考虑如何 Foo 将是 习惯于 . 你最终会得到一个只能调用某些方法的对象,你甚至不知道 哪一个 方法可以安全调用。

    如果你知道你只会调用一个方法(例如 count 在您的示例中),这是一个独立的功能,可以单独封装在一个接口中—此时,现有的lambda表达式功能就可以了。如果你 不要 知道你只想使用一种方法,那么你的建议无论如何都不会有帮助。