【发布时间】:2009-10-02 21:27:00
【问题描述】:
public interface Foo {
}
public class SpecificFoo implements Foo {
}
public interface SomeInterface {
void thisMethod(Foo someKindOfFoo);
}
public class SomeClass implements SomeInterface {
public void thisMethod(Foo someKindOfFoo) {
// calling code goes into this function
System.out.println("Dont go here please");
}
public void thisMethod(SpecificFoo specificFoo) {
// not into this function
System.out.println("Go here please");
}
}
public class SomeOlderClass {
public SomeOlderClass( SomeInterface inInterface ) {
SpecificFoo myFoo = new SpecificFoo();
inInterface.thisMethod(myFoo);
}
}
调用代码:
SomeClass myClass = new SomeClass();
SomeOlderClass olderClass = new SomeOlderClass(myClass);
我有一个接口(@987654325@),几个类调用(例如SomeOlderClass)。我有一个实现接口的类,但我想对传递到通用接口的特定实现进行类型安全操作。
如上面的代码所示,我真的很希望能够制作另一个与传入接口的特定类型相匹配的方法。这行不通。我认为这是因为调用代码只知道接口,而不知道具有更具体方法的实现(即使SpecificFoo implements Foo)
那么我怎样才能以最优雅的方式做到这一点呢?我可以通过在实现接口的类中添加 if 语句来使代码正常工作 (SomeClass):
public void thisMethod(Foo someKindOfFoo) {
// calling code goes into this function
if ( someKindOfFoo.getClass().equals(SpecificFoo.class) )
thisMethod(SpecificFoo.class.cast(someKindOfFoo));
else
System.out.println("Dont go here please");
}
但是,这并不优雅,因为我每次添加一种新的 Foo 时都必须添加 if 语句。我可能会忘记这样做。
另一个选项是将SpecificFoo 添加到SomeInterface,并让编译器整理提醒我需要SomeClass 中的实现。问题是我最终添加了相当多的样板代码。 (如果其他人实现了接口,他们必须实现新方法,以及任何测试)
鉴于Foo 和SpecificFoo 是相关的,我似乎应该缺少另一个选项。想法?
更多信息:
好吧,我实际上工作了一段时间来尝试简化问题。当我添加更多细节时,复杂性会增加很多。但无论如何……我想我可以解释一下。
基本上,我正在使用 Ray Ryan 在他的talk 中解释的命令模式编写 GWT Web 应用程序 RPC servlet
在 google 代码上有几个它的实现,但是它们中的许多都遇到了这个继承问题。我认为这是 GWT-RPC 代码 bugreport 中的一个错误,但是,当我进一步实施时,我注意到纯粹在客户端发生了类似的问题,并且在托管模式下。 (即所有 java,没有 gwt javascript 疯狂)。
所以我将基本思想抽象为一个原始的 java 命令行案例,并看到了同样的问题,如上所述。
如果您按照 Ray Ryan 讨论的内容进行操作,Foo 是一个动作,SpecificFoo 是我想要调用的特定动作。 SomeInterface 是客户端 RPC 服务,SomeClass 是服务器端 RPC 类。 SomeOlderClass 是一种 rpc 服务,它会知道缓存等等。
很明显,对吧?就像我说的,我认为所有 GWT RPC 的废话只会在基本问题上搅浑水,这就是为什么我尽量简化它。
【问题讨论】:
-
为什么我的耳朵里有血?