首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中,什么是鸭子类型的例子?

在Java中,什么是鸭子类型的例子?
EN

Stack Overflow用户
提问于 2009-07-03 15:08:15
回答 10查看 21.2K关注 0票数 36

我最近刚刚听说过关于鸭子类型的文章,我也读过关于它的Wikipedia article,但是我很难把例子翻译成Java,这真的会对我的理解有所帮助。

有没有人能给出一个清晰的Java鸭子类型的例子,以及我可能如何使用它?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-07-03 15:12:00

Java被设计成不适合于鸭子类型。你可以选择的方式是反射:

代码语言:javascript
运行
复制
public void doSomething(Object obj) throws Exception {

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

但我主张使用动态语言,比如Groovy,这样做更有意义:

代码语言:javascript
运行
复制
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

票数 48
EN

Stack Overflow用户

发布于 2010-05-16 16:57:22

参见this blog post。它非常详细地描述了如何在Java中使用动态代理来实现鸭子类型。

总而言之:

  • 通过键入

创建表示要使用的方法的接口

  • 创建使用此接口的动态代理,以及通过反射(假设签名匹配)调用基础对象上的接口方法的实现对象
票数 11
EN

Stack Overflow用户

发布于 2009-07-03 15:11:10

check this library

代码语言:javascript
运行
复制
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就可以很容易地实现鸭子类型,你应该匹配方法名和返回类型。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1079785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档