只能实现一个接口参数化 - 如何解决?

时间:2009-08-01 22:51:16

标签: java parameters interface limit

以下是我希望能够做到的一个例子(用Java):

interface MyInterface<E> {
  public void doSomething(E foo);
}

class MyClass implements MyInterface<ClassA>, MyInterface<ClassB> {
  public void doSomething(ClassA fooA) {
    ...
  }

  public void doSomething(ClassB fooB) {
    ...
  }
}

当我尝试实现这一点时,编译器告诉我,我只能在MyInterface中实现MyClass一次。我假设MyInterface<ClassA>MyInterface<ClassB>相比被视为不同的类型,但显然不是。这似乎是非常有用的东西,所以我对错误感到惊讶。

更新:感谢您的帮助到目前为止。正如其中一条评论所指出的,以上是抽象的;我试图解决的问题是以一种方式实现Observer模式,即观察者类通过它实现的接口声明它所观察到的那些类,并且还处理它在特定于类的方法中观察到的对象的变化。使用这种方法的优点是,从接口可以清楚地看到一个类实现了它所观察的哪种类型的对象,并且编译器强制程序员明确地实现对所观察的那些类的实例的更改的处理。因此,上面的抽象代码实际上可能类似于以下内容:

interface IsObserverOf<E> {
  public void observedDidChange(E foo);
}

class MyClass implements IsObserverOf<Database>, IsObserverOf<Spreadsheet> {
  public void observedDidChange(Database database) {
    ...
  }

  public void observedDidChange(Spreadsheet spreadsheet) {
    ...
  }
}

在这里,MyClass声明它会观察数据库对象和Spreadsheet对象,并且编译器会在理想的世界范围内要求必须实现两个不同的observeDidChange()方法。

感谢。

2 个答案:

答案 0 :(得分:5)

由于Type Erasure,编译和运行时接口通用位的参数消失。因此,就Java而言,MyInterface<ClassA>MyInterface<ClassB>是相同的,并且在编译时变为MyInterface。我想当他们实现泛型时,可以处理你想要的情况(方法参数的不同类型),但Java如何处理泛型参数用于返回类型的方法:

interface Foo<T> {
    T getSomeObject();
}

问题是你不能重载一个唯一不同的是返回类型的方法,所以这会严重限制能够做implements MyInterface<ClassA|ClassB>之类的事情。

答案 1 :(得分:5)

也许你正在寻找Visitor Pattern(又名“双重派遣”)。