https://cloud.tencent.com/developer/ask/112886
问题
我有一个抽象类和一个抽象方法。我如何使用lambda表达式来实例化它。它不能被制作成一个接口,因为它扩展了一个类。
public class Concrete<T> {
// Has a bunch of predefined methods.
}
public abstract class Abstract<T> extends Concrete<T> {
public T getSomething();
// Uses inherited methods from Concrete class
}
public class Driver {
public static void main(String[] args) {
System.out.println(new Abstract<String>() {
public String getSomething() {
// Returns something using inherited methods from Abstract
// Class and Concrete Class
}
});
}
}
回答
public class AbstractLambda<T> extends Abstract<T>
{
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<String> a = new AbstractLambda<>(() -> "Hello World");
System.out.println(a.getSomething()); // prints 'Hello World'
你可能也注意到,这是java.lang.Thread该类如何支持Runnables开箱即用:
Thread t = new Thread(() -> System.out.println("Hello World"));
t.start(); // eventually prints 'Hello World'
总结
- 另外定义一个函数接口,其中的方法就是抽象类的抽象方法
- 定义一个抽象类的子类,有个属性是上面定义函数接口.子类实现了抽象方法,就是直接调用函数接口中的方法.