抽象类的Lambda表达式

我有一个抽象类,有一个抽象方法。 我如何使用lambda表达式来实例化它。 它不能成为一个接口,因为它扩展了一个类。

public class Concrete { // Has a bunch of predefined methods. } public abstract class Abstract extends Concrete { public T getSomething(); // Uses inherited methods from Concrete class } public class Driver { public static void main(String[] args) { System.out.println(new Abstract() { public String getSomething() { // Returns something using inherited methods from Abstract // Class and Concrete Class } }); } } 

正如Sleiman Jneidi在他的回答中指出的那样,你无法直接将lambda表达式作为抽象类。 但是,您可以使用变通方法:

 public class AbstractLambda extends Abstract { private final Supplier supplier; public AbstractLambda(Supplier supplier) { this.supplier = supplier; } @Override public T getSomething() { return this.supplier.get(); } } 

这可以与lambda表达式一起使用:

 Abstract a = new AbstractLambda<>(() -> "Hello World"); System.out.println(a.getSomething()); // prints 'Hello World' 

这也是java.lang.Thread允许您使用Runnable lambda而不必子类的类:

 Thread t = new Thread(() -> System.out.println("Hello World")); t.start(); 

不,你不能这样做 。 Lambdas必须在接口上定位单个抽象方法,并且它们不能在抽象类上使用单个抽象方法。 这是怎么回事,你必须接受它,

尽管拥有它们是有意义的,但语言设计者认为通过在SAM抽象类上允许lambdas而引入的复杂性是不值得的。

作为参考,这就是Brian Goetz关于允许在SAM抽象类上使用lambdas的内容。

Brian的电子邮件的主要关键点:

  • 只有3%的lambda候选内部类实例将抽象类作为目标

  • 为了百分之几用例而使模型复杂化似乎是一个糟糕的交易