Java 泛型编程是多态性的一个例子吗?

Java 泛型编程是多态性的一个例子吗?,java,generics,polymorphism,Java,Generics,Polymorphism,我正在做一个家庭作业(一个项目),其中一个标准是我必须以一种显著提高代码整体质量或功能的方式使用多态性 我制作了一个如下所示的哈希表: public class HashTable<E extends Hashable>{ ... } 公共类哈希表{ ... } 其中Hashable是我制作的一个接口,它有一个hash()函数 我知道以这种方式使用泛型可以提高代码的质量,因为现在HashTable可以处理我想要的几乎任何类型(而不仅仅是int或字符串)。但我不确定它是否表

我正在做一个家庭作业(一个项目),其中一个标准是我必须以一种显著提高代码整体质量或功能的方式使用多态性

我制作了一个如下所示的哈希表:

public class HashTable<E extends Hashable>{
    ...
}
公共类哈希表{
...
}
其中Hashable是我制作的一个接口,它有一个hash()函数

我知道以这种方式使用泛型可以提高代码的质量,因为现在HashTable可以处理我想要的几乎任何类型(而不仅仅是int或字符串)。但我不确定它是否表现出多态性

我认为是的,因为E可以是实现Hashable的任何类型。换句话说,HashTable是一个可以处理(实际上)任何类型的类

但我不太确定——这是多态性吗?也许我可以澄清一下多态性到底是什么

提前谢谢


编辑:在收到下面的答案(见:)后,我阅读了维基百科的文章,发现了以下内容:


“在面向对象编程社区中,使用参数多态性的编程通常被称为泛型编程”(重点补充)

是的,它被称为。你将其归类为多态性的理由是正确的。

虽然Rob的回答在某种技术意义上可能是正确的,但我认为这不是人们所要求的。我认为这更可能是您所需要的。

除了参数多态性之外,您可能会调用存储在哈希表中的对象的
hashCode
方法,这是John提到的多态性的一个示例。HashTable依赖于参数多态性,E依赖于(普通)多态性。

简单地说,多态性就是采用许多不同的类,这些类共享一个公共基类(或接口),并将它们都视为该公共基类的成员,不知道或不关心它们是哪个特定的继承类,也不知道它们如何精确地实现公共函数。在面向对象编程中,多态性为您提供了问题域中该部分的相对高级视图—您的意思是,“此代码不关心这些对象的具体细节—只是它们实现了一些常见的函数X、Y、Z”,或者“只是它们都是基本类
基类。


您的示例使用多态性,因为您定义了一个
Hashable
基类,并提供了一个只关心它接收的对象的那个方面的函数<代码>散列对象可能有多种形式,但您的代码将它们视为一个单一的基本类型。

+1:希望提问者的老师不会因为他想到了他们没有想到的东西而给他打分,但这不会改变您答案的+1度或提问者评估的+1度。只要学生尽可能引用它参数多态性“并给出了一个清晰的理由,为什么会这样,怎么会这样,那么他应该没事。如果老师给他打分,那么老师真的不应该教书了。+1:希望我们已经克服了这一点,这不是常识,现在——当我在学校的时候,当我提到这个问题时,老师们都茫然地盯着我看。如果他们想贬低你,就要坚持到底。谢谢麦克斯。顺便说一句,这是一个高中班。我们并没有在课堂上学习泛型(我倾向于这样做,因为我想要一些类似于c++模板类的东西)。因为这是一个高中班,如果不是泛型,那么多态性可能意味着什么?这是一个最好的答案-这是直截了当的,非常有帮助;谢谢@CS学生:泛型编程与更“经典”的多态性有一些重要的区别。模板化代码基本上会为调用代码的每种类型生成一个新的类/函数。泛型编程不是说“此代码仅在其公共基类级别引用对象”,而是经常说“您可以将任何想要插入此代码的类型名插入,并且它会工作”——没有公共基类,也不依赖于代码可以处理的许多形式的任何共同点。(续)在您的示例中,您可以避免这种情况,因为您将“任何类型名”限制为类型名的子集,而类型名本身就是多态的。还有其他区别(例如,经典多态性可以动态处理不同的类,而模板必须在编译时实例化-不能将模板实例化为程序运行期间确定的类型名)。哈希表将对象的子类视为对象,因此在技术上是多态的。我也同意仿制药是有用的,而且在道德上是好的。然而,我仍然不认为这是一个好例子:我认为学生们很难用这个例子来学习多态性。在我看来,一个恰当的多态性示例需要两个不同的子类被一段代码操纵(作为超类的实例)。你可以选择一个边缘(?)的例子,很高兴你比老师知道得更好,也许还得为你的分数而争论。对,我认为,仅仅使用模板是不确定的。由于他将
Hashable
的子类视为Hashable,我认为他是清楚的-这就是我要强调的地方。