功能接口的基础接口

问题描述 投票:0回答:1

我最近在尝试为功能接口的子类提供通用功能时遇到了这个问题。显然你不能按照我的想法去做(至少对于 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);
}
java generics java-8 functional-interface
1个回答
1
投票

在您的代码中, T 是类型参数,而不是功能接口类型。一种解决方案是向 Base 添加一个额外的类型参数,表示子类的功能接口类型。

示例代码:

@FunctionalInterface 
public interface Base<T extends Base<T, F>, F extends Runnable> {
    void doit();
    
    default T someDefault() {
        return () -> {};
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.