Java 8中的功能接口

Jos*_*one 9 java java-8 codahale-metrics

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

Gauge<Double> foo = () -> { return null; };
RatioGauge bar = () -> { return null; };
Run Code Online (Sandbox Code Playgroud)

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

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

据我所知,RatioGauge是一个功能界面.我错过了什么吗?

ysh*_*vit 22

抽象类(即使它只有一个抽象方法)也不是一个功能接口.只有一个界面可以是一个.

来自JLS 9.8:

功能接口是一个只有一个抽象方法的接口(除了Object的方法)...(强调添加)

最初的想法让abstact类表示为lambda; 它们被称为"SAM类型",代表"单一抽象方法".结果证明这是一个难以有效解决的问题.这个帖子讲的是为什么; 基本上,基类的构造函数使它变得困难.

  • @JoshStone嗯,lambda表达式从来没有打算完全替换匿名类,但仅适用于某些场景. (4认同)
  • @JoshStone没有什么聪明的.您可以创建一个具有功能接口的具体类,并使用它来实现抽象方法.例如,ThreadLocal就是这样做的([withInitial](http://docs.oracle.com/javase/8/docs/api/java/lang/ThreadLocal.html#withInitial-java.util.function.Supplier-)) (2认同)