在具有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); }
以这种方式, B
的addObserver()
方法将覆盖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
。 由于您的ObserverB
inheritance自ObserverA
,您可以安全地将ObserverA
和ObserverB
类型的对象作为参数传递给此方法。
编辑
从您的澄清,您似乎应该创建两个不同的接口,它们之间没有任何层次关系。 它们似乎是无关的,因为您只想为第二种方法提供实现,同时避免使用第一种方法。 因此,您应该将它们分开,而不是强迫自己从第一个接口提供方法的实现。 还有一个OOP原则 – 接口隔离原则 。