类实现一个功能接口。 此类具有多个具有相似签名的方法,即。它们有一个空的参数列表。 接受此函数接口作为参数的方法将接受其中任何方法,即使它们未在接口中定义。
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的一部分。
这坏了吗? 还是这是设计使然?
正如我们从 Java 教程中知道的那样
moveTheFrog(frog::move);
或多或少等同于
moveTheFrog(() -> from.move());
由于参数的目标类型是函数接口,因此 lambda 表达式的主体将成为接口方法的主体。同样,对于方法引用,接口方法的主体将成为被引用方法的主体。
这是该语言的一个功能,与在一个类或另一个类中定义的方法没有任何关系。这是关于方法签名之间的兼容性。
Froginetic
对Froggo
一无所知.