用Java打字的例子是什么?

Cug*_*uga 35 java duck-typing

我刚刚听说鸭子打字,我读了关于它的维基百科文章,但是我很难将这些例子翻译成Java,这真的有助于我理解.

是否有人能够给出一个明确的Java打字输入示例以及我可能如何使用它?

Rob*_*anu 43

Java的设计不适合鸭子打字.您可能选择这样做的方式是反思:

public void doSomething(Object obj) throws Exception {

    obj.getClass().getMethod("getName", new Class<?>[] {}).invoke(obj);
}
Run Code Online (Sandbox Code Playgroud)

但是我会提倡用动态语言来实现它,例如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()
}
Run Code Online (Sandbox Code Playgroud)

参考

  • 如果你沿着Java反射路线走过一个叫做'duckapter'的优雅图书馆:http://code.google.com/p/duckapter/ (3认同)
  • ++ Nice duck示例,我喜欢新的对象创建方法. (2认同)

Dea*_*vey 11

看到这篇博文.它详细介绍了如何使用动态代理在Java中实现duck typing.

综上所述:

  • 创建一个接口,通过duck typing来表示您想要使用的方法
  • 创建一个使用此接口的动态代理和一个实现对象,该实现对象通过反射调用底层对象上的接口方法(假设签名匹配)


dfa*_*dfa 6

检查这个库:

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.
Run Code Online (Sandbox Code Playgroud)

使用动态代理,使用接口鸭子输入很简单,您应该匹配方法名称和返回类型.


cd1*_*cd1 5

Java没有实现duck typing.