抽象类的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 extends T> supplier; public AbstractLambda(Supplier extends T> 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候选内部类实例将抽象类作为目标
-
为了百分之几用例而使模型复杂化似乎是一个糟糕的交易