5

我在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);
}

最欢迎黑客解决方案!

4

3 回答 3

4

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

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

于 2013-04-02T12:54:33.070 回答
2

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

public interface Observer<T> {
    void addObserver(T t);
}

public class First implements Observer<First> {
    @Override
    public void addObserver(First t) {
    }
}

public class Second implements Observer<Second> {
    @Override
    public void addObserver(Second t) {
    }
}

如您所见,First 和 Second 类都实现了相同的接口,但具有不同类型的参数。他们用自己对实现的接口进行参数化,但不是写Observer<Frist>你可以写Observer<Integer>或任何你想要的。

编辑

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

interface ObserverA {}

interface A<T> {
    void method1();
    void addObserver(T o);
}

interface ObserverB extends ObserverA {}

interface B extends A<ObserverB> {
    void method2();
}
于 2013-03-29T09:39:38.927 回答
1

怎么样 -

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类型的对象作为参数传递给此方法。

编辑

根据您的说明,您似乎应该创建两个不同的接口,它们之间没有任何层次关系。它们似乎不相关,因为您只想为第二种方法提供实现,同时避免第一种方法。因此,与其强迫自己从第一个接口中提供方法的实现,不如将它们分开。这个还有一个面向对象的原则——接口隔离原则

于 2013-03-29T09:15:05.847 回答