我看到单参数构造函数Thread()同时采用Runnable和。String编译器如何知道 alambda正在实现一个Runnable类而不是一个String类? (new Thread( () -> {
System.out.println("Deleting stats...");
})).start();也许它取决于类/接口中方法的数量?但是,如果一个类有多个构造函数,这些构造函数采用只有一个方法的单个参数类,例如:Thread( Runnable r );
Thread( Comparable c );
Thread( ActionListener al );当你尝试实现lambdathen 时会发生什么?编译器如何知道正在lambda实现哪个类?
2 回答
三国纷争
TA贡献1804条经验 获得超7个赞
Java 编译器必须为 lambda 表达式的类型选择函数接口类型。这受JLS 第 15.27.3 条管辖,其中规定:
如果 T 是函数接口类型(第 9.8 节)并且表达式与从 T 派生的基本目标类型的函数类型一致,则 lambda 表达式在赋值上下文、调用上下文或转换上下文中与目标类型T兼容。
该类型String
不是函数式接口类型,但Runnable
确实是。lambda 不接受参数也不返回数据,因此它与一致Runnable
。
更一般地,lambda 表达式中的参数类型必须与函数接口类型的单个抽象方法的参数类型匹配,并且返回类型也必须匹配。
在您的示例中,3 种功能接口类型中的每一种都是不同的,因此最多有一种会匹配。如果有多个可能匹配的函数接口类型,那么这将是不明确的,只能通过将 lambda 表达式转换为预期的函数接口类型来解决。
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
Lambda 表达式被转换为实现函数式接口的类的实例。“函数式接口”是指其中仅包含 1 个(非默认)方法的接口。
String 不是一个接口 - 它是一个类。因此,编译器查看 lambda 表达式,并知道如果代码有意义,那么它应该将 lambda 转换为 Runnable 实现的实例,因为这是唯一可能起作用的东西!
添加回答
举报
0/150
提交
取消