我最近在尝试为功能接口的子类提供通用功能时遇到了这个问题。显然你不能按照我的想法去做(至少对于 Java 8):
@FunctionalInterface
public interface Base<T extends Base<T>> {
void doit();
default T someDefault() {
return () -> {}; //incompatible types: T is not a functional interface
}
}
有没有办法做到这一点?还是故意不允许的?也许滥用默认方法?
也许一个用例示例是个好主意:
@FunctionalInterface
public interface Processor<I, T extends Processor<I, T>> {
T process(I input);
default T requireNonNull(I i) {
return (I input) -> {
Objects.requireNonNull(i);
process(input);
};
}
}
@FunctionalInterface
public interface Parser<T> extends Processor<String, T> {
@Override
default T process(String s) {
return parse(s);
}
T parse(String s);
}
在您的代码中, T 是类型参数,而不是功能接口类型。一种解决方案是向 Base 添加一个额外的类型参数,表示子类的功能接口类型。
示例代码:
@FunctionalInterface
public interface Base<T extends Base<T, F>, F extends Runnable> {
void doit();
default T someDefault() {
return () -> {};
}
}