我最近刚刚听说过关于鸭子类型的文章,我也读过关于它的Wikipedia article,但是我很难把例子翻译成Java,这真的会对我的理解有所帮助。
有没有人能给出一个清晰的Java鸭子类型的例子,以及我可能如何使用它?
发布于 2009-07-03 15:12:00
Java被设计成不适合于鸭子类型。你可以选择的方式是反射:
public void doSomething(Object obj) throws Exception {
obj.getClass().getMethod("getName", new Class<?>[] {}).invoke(obj);
}但我主张使用动态语言,比如Groovy,这样做更有意义:
class Duck {
quack() { println "I am a Duck" }
}
class Frog {
quack() { println "I am a Frog" }
}
quackers = [ new Duck(), new Frog() ]
for (q in quackers) {
q.quack()
}Reference
发布于 2010-05-16 16:57:22
参见this blog post。它非常详细地描述了如何在Java中使用动态代理来实现鸭子类型。
总而言之:
创建表示要使用的方法的接口
发布于 2009-07-03 15:11:10
check this library
interface MyInterface {
void foo();
int bar(int x, int y);
int baz(int x);
}
public class Delegate {
public int bar() {
return 42;
}
}
DuckPrxy duckProxy = new DuckPrxyImpl();
MyInterface prxy = duckProxy.makeProxy(MyInterface.class, new Delegate());
prxy.bar(2, 3); // Will return 42.有了接口,使用Dynamic Proxy就可以很容易地实现鸭子类型,你应该匹配方法名和返回类型。
https://stackoverflow.com/questions/1079785
复制相似问题