重写 returns 并使用通用 class 和 sub-interfaces 的方法
Overriding method that returns and consumes a generic class with sub-interfaces
我想制作一个通用接口,它有两个抽象方法,其中一个 returns 并使用相同通用接口类型的 sub-type。
我想要实现的目标是创建 @FunctionalInterfaces
具有相同的 parent,但不同的组合方式。
我的第一个方法如下,
public interface ParentFunction<T, C extends ParentFunction> {
void doSomething(T t);
C<T> compose(C<T> other);
}
@FunctionalInterface
public interface SonFunction<T> extends ParentFunction<T, SonFunction> {
@Override
default SonFunction<T> compose(SonFunction<T> other){
return null;
}
}
@FunctionalInterface
public interface SonFunction<T> extends ParentFunction<T, SonFunction> {
@Override
default DaughterFunction<T> compose(SonFunction<T> other){
return null;
}
}
但是编译错误发生在 parent 方法的 C<T>
说 'Type "C" does not have type parameters,' 和另一个 child 默认方法的 @Override
。
我可以在不扩展的情况下分离我的 child 接口,但我希望它们有一个客户端代码只知道的 super-type。
有什么很酷的技巧可以实现吗?
在Java中,你不能做C<T>
,但是,你可以要求C扩展ParentFunction<T,C>
同样适用于您的 SonFunction
和 DaughterFunction
。
试试这个:
public interface ParentFunction<T, C extends ParentFunction<T, C>> {
void doSomething(T t);
C compose(C other);
}
@FunctionalInterface
public interface SonFunction<T> extends ParentFunction<T, SonFunction<T>> {
@Override
default SonFunction<T> compose(SonFunction<T> other){
return null;
}
}
@FunctionalInterface
public interface DaughterFunction<T> extends ParentFunction<T, DaughterFunction<T>> {
@Override
default DaughterFunction<T> compose(DaughterFunction<T> other){
return null;
}
}
我想制作一个通用接口,它有两个抽象方法,其中一个 returns 并使用相同通用接口类型的 sub-type。
我想要实现的目标是创建 @FunctionalInterfaces
具有相同的 parent,但不同的组合方式。
我的第一个方法如下,
public interface ParentFunction<T, C extends ParentFunction> {
void doSomething(T t);
C<T> compose(C<T> other);
}
@FunctionalInterface
public interface SonFunction<T> extends ParentFunction<T, SonFunction> {
@Override
default SonFunction<T> compose(SonFunction<T> other){
return null;
}
}
@FunctionalInterface
public interface SonFunction<T> extends ParentFunction<T, SonFunction> {
@Override
default DaughterFunction<T> compose(SonFunction<T> other){
return null;
}
}
但是编译错误发生在 parent 方法的 C<T>
说 'Type "C" does not have type parameters,' 和另一个 child 默认方法的 @Override
。
我可以在不扩展的情况下分离我的 child 接口,但我希望它们有一个客户端代码只知道的 super-type。
有什么很酷的技巧可以实现吗?
在Java中,你不能做C<T>
,但是,你可以要求C扩展ParentFunction<T,C>
同样适用于您的 SonFunction
和 DaughterFunction
。
试试这个:
public interface ParentFunction<T, C extends ParentFunction<T, C>> {
void doSomething(T t);
C compose(C other);
}
@FunctionalInterface
public interface SonFunction<T> extends ParentFunction<T, SonFunction<T>> {
@Override
default SonFunction<T> compose(SonFunction<T> other){
return null;
}
}
@FunctionalInterface
public interface DaughterFunction<T> extends ParentFunction<T, DaughterFunction<T>> {
@Override
default DaughterFunction<T> compose(DaughterFunction<T> other){
return null;
}
}