1

这是我希望能够做的一个例子(在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) {
    ...
  }
}

当我尝试实现它时,编译器告诉我我只能MyInterfaceMyClass. 我曾假设MyInterface<ClassA>与 相比,它被视为不同的类型MyInterface<ClassB>,但显然不是。这似乎非常有用,所以我对这个错误感到惊讶。

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

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 声明它观察 Database 对象和 Spreadsheet 对象,并且编译器将(在理想情况下)要求必须实现两个不同的 observedDidChange() 方法。

谢谢。

4

2 回答 2

5

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

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

那里的问题是你不能重载一个唯一的区别是返回类型的方法,所以这将严重限制能够做类似implements MyInterface<ClassA|ClassB>.

于 2009-08-01T23:05:47.287 回答
5

也许您正在寻找访问者模式(又名“双重调度”)。

于 2009-08-01T23:05:51.703 回答