10

我很难弄清楚为什么 lambda 表达式可以分配给某些功能接口,但不能分配给其他接口。一个示例,使用Metrics 库中的一些功能接口:

Gauge<Double> foo = () -> { return null; };
RatioGauge bar = () -> { return null; };

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

此表达式的目标类型必须是函数式接口

据我所知,RatioGauge 是一个功能接口。我错过了什么吗?

4

2 回答 2

24

抽象类(即使它只有一个抽象方法)不是函数式接口。只有一个接口可以是一个。

JLS 9.8开始:

函数式接口只有一个抽象方法的接口(除了 Object 的方法)...(强调)

最初的想法让抽象类表示为 lambda;它们被称为“SAM 类型”,代表“单一抽象方法”。事实证明,这是一个难以有效解决的问题。该线程讨论了一些原因;基本上,基类的构造函数使它变得困难。

于 2014-04-01T19:04:34.630 回答
1

一个函数接口只能有一个抽象方法(除了来自 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 有很多方法。

于 2017-05-02T15:34:56.953 回答