我有一个抽象类,有一个抽象方法.我如何使用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
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
Cla*_*oft 46
正如Sleiman Jneidi在他的回答中指出的那样,你不能直接使lambda表达式成为一个抽象类.但是,您可以使用变通方法:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这可以与lambda表达式一起使用:
Abstract<String> a = new AbstractLambda<>(() -> "Hello World");
System.out.println(a.getSomething()); // prints 'Hello World'
Run Code Online (Sandbox Code Playgroud)
如果您的getSomething(...)方法有参数,请使用包中java.util.function.Function的适当接口java.util.function而不是java.util.function.Supplier.
这也是java.lang.Thread允许你使用Runnablelambda而不是必须子类的方法:
Thread t = new Thread(() -> System.out.println("Hello World"));
t.start();
Run Code Online (Sandbox Code Playgroud)