参数多态和子类型多态之间的概念差异是什么?

10

我曾试图阅读维基百科,但它在多态性(尤其是与Java相关的)方面非常复杂。我的理解是子类型多态性与子类型有关,参数多态性与方法在不同对象/类之间被泛化有关?我错了什么吗?

2个回答

12
正如文章所述, 参数多态允许以通用方式编写函数或数据类型,从而可以处理值而不依赖于它们的类型... 参数多态在几种面向对象语言中也可用,其中经常以“泛型”(例如Java)或“模板”(C++和D)的名称出现。
换句话说,这意味着可以创建一个函数,该函数接受一组某些内容,而无论这些某些是什么,该函数都可以正常工作。 想象一下返回集合中元素数量的方法。 可以传递任何类型元素的列表,并且它将返回一个答案。 不必为每种要传入的列表重新编写该函数。
有些语言使用子类型的概念来限制可以在特定情况下使用的类型范围。 在这些语言中,子类型多态(有时称为包含多态或动态多态[citation needed])允许编写函数以接受某个类型T的对象,但如果传递到属于类型S的对象,则也可以正确工作,S是T的子类型

换句话说,可以创建一个将Animal作为参数的方法,但也可以将Cat或Dog传递给它,因为Cat和Dog都是动物。

2

您可以在JDK中找到示例。

参数多态性的示例:

public static <T> void sort(T[] a, Comparator<? super T> c) {
   ...
}

该方法可以接受任何类型的T,并以相同方式处理它:

Arrays.sort(new String[]{"a", "1"}, new Comparator<String>() { ... });

子类型多态性的示例:

Executors.newSingleThreadExecutor().submit(runable);

在这里,ExecutorService 并不关心 Runable 的实际实现,它只需要可以运行的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接