我很难理清为什么lambda表达式可以分配给某些功能接口,而不是其他功能接口。例如,使用Metrics library:
中的一些功能接口Gauge<Double> foo = () -> { return null; };
RatioGauge bar = () -> { return null; };
第二个语句有一个编译错误(在Eclipse中):
此表达式的目标类型必须是功能接口
据我所知,RatioGauge is a functional interface。我错过了什么吗?
答案 0 :(得分:22)
抽象类(即使它只有一个抽象方法)也不是一个功能接口。只有一个界面可以是一个。
来自JLS 9.8:
功能界面是一个接口,只有一个抽象方法(除了Object的方法)...(强调添加)
最初的想法是让abstact类表示为lambda;它们被称为“SAM类型”,代表“单一抽象方法”。结果证明这是一个难以有效解决的问题。 This thread谈谈为什么;基本上,基类的构造函数很难。
答案 1 :(得分:0)
一个函数接口只能有 ONE 抽象方法(除了Object类的方法)。
Gauge.java的源代码= http://grepcode.com/file/repo1.maven.org/maven2/com.codahale.metrics/metrics-core/3.0.0/com/codahale/metrics/Gauge.java#Gauge
RatioGauge.java = http://grepcode.com/file/repo1.maven.org/maven2/com.codahale.metrics/metrics-core/3.0.0/com/codahale/metrics/RatioGauge.java
的源代码请注意,Gauge.java只有一个抽象方法,而RatioGauge有很多方法。