在具有泛型的子类型的继承接口中覆盖方法

Chi*_*rlo 5 java generics inheritance overriding

我在java中有以下层次结构:

interface ObserverA {}

interface A {
  void method1();
  addObserver(Observer o);
}
Run Code Online (Sandbox Code Playgroud)

我想像这样扩展它:

interface ObserverB extends ObserverA{}

interface B extends A {
   void method2();
   addObserver(ObserverB  o);
}
Run Code Online (Sandbox Code Playgroud)

以这种方式,addObserver()方法B将覆盖相同的方法A.因为它不起作用,实现B将需要实现两个版本addObserver(),我不会只有一个.

这可以通过一种不需要参数化的聪明方式完成A:

interface A<O extends Observer> { 
    addObserver(O o);
}
Run Code Online (Sandbox Code Playgroud)

Hackish解决方案非常受欢迎!

MD *_*med 1

怎么样 -

interface ObserverA {}

interface A {

    <T extends ObserverA> void addObserver(T o);
}
Run Code Online (Sandbox Code Playgroud)

和 -

interface ObserverB extends ObserverA{}

interface B extends A{

    // do nothing, or omit this interface entirely.

}
Run Code Online (Sandbox Code Playgroud)

这样您就可以将继承的任何类型ObserverA作为参数传递给该addObserver方法。

如果您正在寻找一些解释,请继续阅读。

我已更改第一个接口中的方法以使用Bounded Type Parameter。按照它的声明方式,它将允许任何对象作为参数传递给该addObserver方法,只要它的类型是ObserverA,或者它继承自ObserverA。由于您ObserverB继承自,因此您可以安全地将和类型ObserverA的对象作为参数传递给此方法。ObserverAObserverB

编辑

从您的澄清来看,您似乎应该创建两个不同的接口,它们之间没有任何层次关系。它们似乎不相关,因为您只想为第二种方法提供实现,同时避免第一种方法。因此,您应该将它们分开,而不是强迫自己提供第一个接口中的方法的实现。这还有一个OOP原则——接口隔离原则