这是我基本上想要的代码,它不会编译:
interface Interface {
interface ArgumentInterface {
// Some methods
}
void doCallback(Consumer<? super ArgumentInterface> callback);
}
interface SubInterface extends Interface {
interface ArgumentSubInterface extends ArgumentInterface {
// Some more methods
}
@Override
void doCallback(Consumer<? super ArgumentSubInterface> callback);
}
Run Code Online (Sandbox Code Playgroud)
这里的想法是Interface将ArgumentInterface的实例传递给用户提供的Consumer,而SubInterface将传递更具体的ArgumentSubInterface的实例.特别是,我希望用户能够将Consumer <ArgumentSubInterface>传递给SubInterface.doCallback()并使其工作.
天真地看起来这应该像写作一样:接口版本接受的任何参数也将被SubInterface的版本接受.但是,Java声称该方法不会覆盖.
它不起作用,因为Java不允许使用逆变参数进行覆盖.您可以做的是Interface使用ArgumentInterface您要接受的特定类型进行参数化:
interface Interface<T extends ArgumentInterface> {
interface ArgumentInterface {
// Some methods
}
void doCallback(Consumer<? super T> callback);
}
interface SubInterface extends Interface<ArgumentSubInterface> {
interface ArgumentSubInterface extends ArgumentInterface {
// Some more methods
}
// This is implicitly inherited
// @Override
// void doCallback(Consumer<? super ArgumentSubInterface> callback);
}
Run Code Online (Sandbox Code Playgroud)