为什么我不能将lambda赋给Object?
我试图将lambda分配给Object类型:
Object f = ()->{};
它给我错误说:
The target type of this expression must be a functional interface
为什么会这样,以及如何做到这一点?
这是不可能的。 根据错误消息, Object
不是function接口,即具有单个公共方法的接口,因此您需要使用引用类型,例如
Runnable r = () -> {};
发生这种情况是因为Java语言中没有“lambda类型”。
当编译器看到lambda表达式时,它会尝试将其转换为您尝试定位的function接口类型的实例。 这只是语法糖。
编译器只能将lambda表达式转换为声明了单个抽象方法的类型。 这就是它所谓的“function界面”。 而Object
显然不适合这种情况。
如果你这样做:
Runnable f = (/*args*/) -> {/*body*/};
然后,Java将能够将lambda表达式转换为扩展Runnable
的匿名类的实例。 从本质上讲,它与写作是一回事:
Runnable f = new Runnable() { public void run(/*args*/) { /*body*/ } };
我添加了注释/*args*/
和/*body*/
只是为了让它更清晰,但不需要它们。
由于f
的类型签名,Java可以推断lamba表达式必须是Runnable
类型。 但是,Java世界中没有“lambda类型”。
如果您正在尝试创建一个在Java中不执行任何操作的generics函数,则不能。 Java是100%静态类型和面向对象的。
匿名内部类和lambdas表达式之间存在一些差异,但您可以查看它们,因为它们只是使用单个抽象方法实例化类型对象的语法糖。