Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Duck类型和泛型编程_Java_C++_Templates_Generics_Duck Typing - Fatal编程技术网

Java Duck类型和泛型编程

Java Duck类型和泛型编程,java,c++,templates,generics,duck-typing,Java,C++,Templates,Generics,Duck Typing,我找了一会儿,找不到一个明确的、笼统的答案,只有一些矛盾的、特别的意见。[1] 所以我想知道duck类型和泛型编程之间的关系是什么?(DTGP)。泛型编程我指的是C++模板或java泛型,但一般的答案,如果可能的话,与概念有关,将受到欢迎。p> 我知道泛型编程将在编译时处理,而duck类型将在运行时处理,但显然我不知道如何定位它们 最后,我不想开始辩论,所以我希望答案是赞成理由、反对理由 [1] Java不支持该语言中的duck类型。它确实支持可以实现相同目标的反射。就我所见,它与Java的泛型

我找了一会儿,找不到一个明确的、笼统的答案,只有一些矛盾的、特别的意见。[1]

所以我想知道duck类型和泛型编程之间的关系是什么?(DTGP)。泛型编程我指的是C++模板或java泛型,但一般的答案,如果可能的话,与概念有关,将受到欢迎。p> 我知道泛型编程将在编译时处理,而duck类型将在运行时处理,但显然我不知道如何定位它们

最后,我不想开始辩论,所以我希望答案是赞成理由、反对理由


[1] Java不支持该语言中的duck类型。它确实支持可以实现相同目标的反射。就我所见,它与Java的泛型没有任何关系,事实上,让它们一起工作是一件非常痛苦的事情。

这确实是一个词汇问题。从最普遍的意义上说, 泛型编程与编译时vs。 运行时:它是一般问题的解决方案。一个很好的例子 运行时使用泛型编程的地方是Python,但也有可能 在C++中实现运行时泛型编程(以显著的成本) 在执行时间内)

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

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

1) 仅在运行时键入。类型是对象的属性,而不是变量,因此,当您调用对象上的方法或以其他方式使用其凭借类型而具有的属性时,必须在运行时[*]发现该方法的存在或不存在。因此,如果它“看起来像只鸭子,嘎嘎叫起来像只鸭子”(即,如果它原来有一个
quack()
函数),那么它“就是”一只鸭子(无论如何,你可以把它当作鸭子对待)。通过这个定义,C++模板在第一个障碍中,使用静态类型。 2) 一个更普遍的名称,用于表示如果它看起来像鸭子,嘎嘎叫起来像鸭子,那么它就是鸭子的原则,这意味着任何设置,其中接口由接口的使用者执行的操作隐式定义,而不是由生产者显式公布的接口(实现接口的任何接口)。通过这个定义,C++模板确实使用了一种鸭类型,但是在编译时,不是在运行时,而是根据其静态类型而不是动态类型来确定是否“看起来像鸭子”。“在编译时检查,此变量的静态类型会嘎嘎吗?”,而不是“在运行时检查,此对象会嘎嘎吗?”

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

“泛型编程”可以使用duck类型,也可以不使用,具体取决于具体的细节。C++通用容器使用“2型”鸭式输入,因为对于C++中的一般类型,它不能保证复制、比较、获取散列值等。java泛型容器不,对象< /代码>已经有足够的方法使其可哈希等。 相反,我怀疑任何使用duck类型的操作都可以被合理地称为“泛型编程”。所以我想,按照你要求的术语,在duck类型中GP>DT(任何一种定义)都是可以称为“泛型”的大量内容的严格子集

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

对我来说,“duck typing”意味着没有明确的一致性关系。如果某物走路像鸭子,说话像鸭子,那么它可以像鸭子一样对待,不需要明确声明它是鸭子。在C++术语中,它不需要从鸭基类继承:继承是声明一个类符合另一个显式接口的方式。 这个概念与类型检查是在运行时还是在编译时发生是正交的。像Smalltalk这样的语言提供在运行时发生的duck类型(继承用于重用实现,而不是声明接口的一致性)。C++模板是编译时发生的一种鸭式输入。
最后一句就是问题的答案。

泛型编程的优点是编译时检查;duck类型的优点是灵活性。正如@Peter Lawrey指出的,Java不支持duck-typing。这是问题的答案吗?这是问题的答案,因为它适用于Java。我不能给出一个很好的答案