Java 8中的功能接口

时间:2014-04-01 19:03:06

标签: java java-8 codahale-metrics

我很难理清为什么lambda表达式可以分配给某些功能接口,而不是其他功能接口。例如,使用Metrics library

中的一些功能接口
Gauge<Double> foo = () -> { return null; };
RatioGauge bar = () -> { return null; };

第二个语句有一个编译错误(在Eclipse中):

  

此表达式的目标类型必须是功能接口

据我所知,RatioGauge is a functional interface。我错过了什么吗?

2 个答案:

答案 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有很多方法。