Chi*_*rlo 5 java generics inheritance overriding
我在java中有以下层次结构:
interface ObserverA {}
interface A {
  void method1();
  addObserver(Observer o);
}
我想像这样扩展它:
interface ObserverB extends ObserverA{}
interface B extends A {
   void method2();
   addObserver(ObserverB  o);
}
以这种方式,addObserver()方法B将覆盖相同的方法A.因为它不起作用,实现B将需要实现两个版本addObserver(),我不会只有一个.
这可以通过一种不需要参数化的聪明方式完成A:
interface A<O extends Observer> { 
    addObserver(O o);
}
Hackish解决方案非常受欢迎!
怎么样 -
interface ObserverA {}
interface A {
    <T extends ObserverA> void addObserver(T o);
}
和 -
interface ObserverB extends ObserverA{}
interface B extends A{
    // do nothing, or omit this interface entirely.
}
这样您就可以将继承的任何类型ObserverA作为参数传递给该addObserver方法。
如果您正在寻找一些解释,请继续阅读。
我已更改第一个接口中的方法以使用Bounded Type Parameter。按照它的声明方式,它将允许任何对象作为参数传递给该addObserver方法,只要它的类型是ObserverA,或者它继承自ObserverA。由于您ObserverB继承自,因此您可以安全地将和类型ObserverA的对象作为参数传递给此方法。ObserverAObserverB
编辑
从您的澄清来看,您似乎应该创建两个不同的接口,它们之间没有任何层次关系。它们似乎不相关,因为您只想为第二种方法提供实现,同时避免第一种方法。因此,您应该将它们分开,而不是强迫自己提供第一个接口中的方法的实现。这还有一个OOP原则——接口隔离原则。
| 归档时间: | 
 | 
| 查看次数: | 4338 次 | 
| 最近记录: |