首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >鸭子类型和泛型编程

鸭子类型和泛型编程
EN

Stack Overflow用户
提问于 2012-09-17 18:02:39
回答 4查看 1.7K关注 0票数 6

我找了一段时间,找不到一个明确而普遍的答案,只有一些相互矛盾和独特的意见。1

那么,我想知道的是什么是鸭子类型和泛型编程之间的关系?( DT < GP,DT == GP,DT > GP )。在泛型编程中,我特别提到了C++模板或Java泛型,但如果可能的话,欢迎与这些概念相关的通用答案。

我知道泛型编程将在编译时处理,而鸭子类型将在运行时处理,但其中一部分我不知道如何定位它们。

最后,我不想开始辩论,所以我更喜欢像理由、反对理由这样的答案。

1

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-17 20:59:02

我遇到了"Duck类型“的两种不同的定义。毫无疑问,有人会告诉你,其中一个是“正确的”,另一个是“不正确的”。我只是试图证明它们都被使用了,而不是告诉你它们都是“正确的”,但就我个人而言,我认为更广泛的含义没有什么问题。

1)仅运行时类型。类型是对象的属性,而不是变量的属性,因此当你在对象上调用一个方法,或者以其他方式使用它凭借其类型而具有的属性时,该方法的存在或不存在都会在运行时被发现*。因此,如果它“看起来像一只鸭子,叫起来像一只鸭子”(也就是说,如果它有一个quack()函数),那么它“就是”一只鸭子(不管怎样,你可以把它当做鸭子)。根据这个课程的定义,C++模板在第一个障碍中落入,它们使用静态类型。

2)一个更通用的名称,用于以下原则:如果它看起来像一只鸭子,叫起来像一只鸭子,那么它就是一只鸭子,意思是任何这样的设置,其中接口是由接口的消费者执行的操作隐式定义的,而不是由生产者显式通告的接口(无论实现接口的是什么)。根据这个定义,C++模板确实使用了一种鸭子类型,但是否“看起来像鸭子”是在编译时而不是在运行时根据其静态类型而不是动态类型来确定的。“在编译时检查,此变量的静态类型是否可以嘎嘎作响?”,而不是“在运行时检查,此对象能否嘎嘎?”。

在我看来,争论实际上是关于Python是否“拥有”这个术语,因此只有类似Python的类型系统才能被称为“鸭子类型”,或者其他人是否可以自由地在不同的上下文中使用该术语来表示类似的概念。无论你认为它应该是什么意思,使用一个“开玩笑”的术语并要求每个人都从它中理解相同的正式定义似乎是不负责任的。所以不是一个合适的论坛来告诉你一个术语“应该”是什么意思,除非你问的是一个权威的来源,比如字典或任何正式定义它的学术论文。我认为它可以告诉你它的实际含义。

“泛型编程”可以利用也可以不利用鸭子类型,这取决于确切的细节。C++泛型容器确实使用了“类型2”的鸭子类型,因为对于C++中的一般类型,不能保证你可以复制它,比较它,获取散列值等。Object泛型容器不能,Object已经有足够的方法使它可哈希等。

相反,我怀疑你所做的任何使用了鸭子类型的事情,都可以被合理地称为“泛型编程”。所以我想,按照你所要求的术语,GP > DT在鸭子类型(不管是哪种定义)中都是一个严格的子集,是可以称为“泛型”的众多东西中的一个子集。

*嗯,在某些情况下,您的动态语言可能会有一些静态分析,以某种方式证明这种情况,但该语言要求能够将此检查推迟到运行时,以应对静态分析无法得出结论的情况。

票数 8
EN

Stack Overflow用户

发布于 2012-09-17 18:25:12

这实际上是一个词汇问题。在最一般的意义上,泛型编程与编译时与运行时的问题无关:它是对一般问题的解决方案。Python是泛型编程运行时的一个很好的例子,但是也可以用C++实现运行时泛型编程(在执行时间上要付出很大的代价)。

鸭子类型是一个正交的概念,通常用于隐含运行时类型。同样,最常被引用的现代示例是Python,但许多语言,从Lisp开始,在过去都使用过它。作为一般规则,C++和Java都明确选择不支持鸭子类型。这是一种权衡:安全性与灵活性(或编译时错误与运行时错误)。

票数 6
EN

Stack Overflow用户

发布于 2012-09-17 18:10:11

Java不支持语言中的鸭子类型。它确实支持反射,可以实现同样的功能。据我所知,它与Java的泛型没有任何关系,事实上,让它们一起工作是一件很痛苦的事情。

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

https://stackoverflow.com/questions/12457022

复制
相关文章

相似问题

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