子类型如何"保证"它将使用更具体的类型调用回调?

D0S*_*ots 0 java generics

这是我基本上想要的代码,它不会编译:

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声称该方法不会覆盖.

shm*_*sel 5

它不起作用,因为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)