Mic*_*erf 1 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) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试实现它时,编译器告诉我,我只能实现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) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,MyClass声明它观察数据库对象和Spreadsheet对象,并且编译器在理想的世界范围内要求必须实现两个不同的observeDidChange()方法.
谢谢.
由于类型擦除,编译和运行时接口的通用位的参数消失.因此就Java而言,MyInterface<ClassA>
它 MyInterface<ClassB>
是相同的,并且MyInterface
在编译时变得恰到好处.我想当他们实现泛型时,可以处理你想要的情况(方法参数的不同类型)但是Java如何处理泛型参数用于返回类型的方法:
interface Foo<T> {
T getSomeObject();
}
Run Code Online (Sandbox Code Playgroud)
问题在于你不能重载一个唯一不同的是返回类型的方法,所以这会严重限制能够做类似事情的有用性implements MyInterface<ClassA|ClassB>
.