在具有generics的子类型的inheritance接口中覆盖方法

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

interface ObserverA {} interface A { void method1(); addObserver(Observer o); } 

我想像这样扩展它:

 interface ObserverB extends ObserverA{} interface B extends A { void method2(); addObserver(ObserverB o); } 

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

这可以通过巧妙的方式完成,不需要参数化A如:

 interface A { addObserver(O o); } 

Hackish解决方案非常受欢迎!

您不能在子接口或子类中缩小方法参数类型。 您只能扩展它们,因为子类型的实现必须能够履行超类型的约定。

同样,出于同样的原因,您可以缩小返回类型和exception,但不能扩展它们。

虽然您的示例显示了不同的内容,但我想您希望获得由不同类实现的通用接口。 看看这个:

 public interface Observer { void addObserver(T t); } public class First implements Observer { @Override public void addObserver(First t) { } } public class Second implements Observer { @Override public void addObserver(Second t) { } } 

正如您所看到的,First和Second类都实现了相同的接口,但具有不同类型的参数。 它们使用自己的参数化参数化实现的接口,但是您可以编写Observer或任何您想要的东西,而不是编写Observer

编辑

考虑到您的说明,这将是您提供的界面层次结构中代码的通用实现。

 interface ObserverA {} interface A { void method1(); void addObserver(T o); } interface ObserverB extends ObserverA {} interface B extends A { void method2(); } 

怎么样 –

 interface ObserverA {} interface A {  void addObserver(T o); } 

而且 –

 interface ObserverB extends ObserverA{} interface B extends A{ // do nothing, or omit this interface entirely. } 

这样您就可以将任何inheritanceObserverA类型作为参数传递给addObserver方法。

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

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

编辑

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