Java 8方法通过签名推断的参考解析,这是破了吗?

时间:2014-04-08 02:09:41

标签: java methods functional-programming

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

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}
            }
        }
    }

编译器是否可以看到frog :: jump未在Froginetics中定义? moveTheFrog方法的设计者肯定不会期待,也不会解释frog :: croak的影响。

看起来好的老式C函数ptrs现在是Java的一部分。

这打破了吗?或者这是设计?

1 个答案:

答案 0 :(得分:0)

我们知道from the Java tutorials

moveTheFrog(frog::move);

或多或少等同于

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

因为参数的目标类型是函数接口,所以lambda表达式的主体成为接口方法的主体。类似地,对于方法引用,接口方法的主体成为引用方法的主体。

这是该语言的一个特性,与在一个或另一个类中定义的方法无关。这是关于方法签名之间的兼容性。

FrogineticFroggo一无所知。