Java 8 通过签名推断方法引用解析,这是否损坏?

标签 java methods functional-programming

类实现函数式接口(interface)。这个类有多个具有相似签名的方法,即。他们有一个空的参数列表。接受此函数接口(interface)作为参数的方法将接受这些方法中的任何一个,即使它们没有在接口(interface)中定义。

public class Frogs {
    public static void main(String[] args) {
        Froggo frog = new Froggo();
        moveTheFrog(frog::move);
        moveTheFrog(frog::jump);
        moveTheFrog(frog::swim);
        moveTheFrog(frog::croak);
        }
    static void moveTheFrog(Froginetic froginetic) {
        froginetic.move();
        }
    @FunctionalInterface
    interface Froginetic {
        void move();
        }
    static class Froggo implements Froginetic {
        @Override
        public void move() { System.out.println("move"); }
        void swim() { System.out.println("swim"); }
        void jump() { System.out.println("jump"); }
        void croak() { 
            System.out.println("croak"); 
            System.exit(2460); // bucks}
            }
        }
    }

编译器看不到 Froginetics 中没有定义 frog::jump 吗? moveTheFrog 方法的设计者绝对不会预料到,也不会考虑 frog::croak 的效果。

看起来老式的 C 函数指针现在已经成为 Java 的一部分。

这是坏了吗?或者这是设计使然?

最佳答案

据我们所知from the Java tutorials

moveTheFrog(frog::move);

或多或少相当于

moveTheFrog(() -> from.move());

由于参数的目标类型是函数接口(interface),因此 lambda 表达式的主体成为接口(interface)方法的主体。类似地,对于方法引用,接口(interface)方法的主体将成为被引用方法的主体。

这是该语言的一项功能,与某个类或另一个类中定义的方法没有任何关系。这是关于方法签名之间的兼容性。

FrogineticFroggo 一无所知。

关于Java 8 通过签名推断方法引用解析,这是否损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22926320/

相关文章:

Java RMI 服务编程

java - @OnDelete 仅与 @OneToMany 一起使用

Java链类

function - 如果存在一个没有方法的类型,你能认为它是一个对象吗?

haskell - 使用 haskell 计算每个单词重复的次数

java - POP 服务器是否按照邮件发送时间的顺序提供电子邮件?

带有controlsfx通知组件的javafx NullPointerException

java - 调用 servlet 类中的方法

c++ - Maybe 和 Either 单子(monad)、短路和性能

java - 如何将 Streams Prev 元素结果传递给下一个