我试过阅读维基百科,但它在多态性问题上非常密集(特别是与Java相关)。我的理解是亚型多态与子类型有关,参数多态与在不同对象/类之间推广的方法有关吗?我错过了什么?
答案 0 :(得分:7)
参数多态允许一般编写函数或数据类型,以便它可以相同地处理值而不依赖于它们的类型...参数多态也可用于几种面向对象的语言,它经常被命名为" generics" (例如,Java)或"模板" (C ++和D)
所以这意味着(例如)你可以创建一个带有 somethings 列表的函数,无论那些 somethings 是什么,该函数都可以工作。想一个返回Collection中元素数量的方法。您可以传入任何类型元素的列表,它将返回一个答案。您不必为传递的每种列表重写该函数。
有些语言采用子类型的思想来限制可以在特定多态性情况下使用的类型范围。在这些语言中,子类型多态性(有时称为包含多态性或动态多态性[需要引用])允许编写一个函数来获取某个类型T的对象,但如果通过则也能正常工作属于类型S的对象,它是T
的子类型
换句话说,您可以使用一种方法将Animal作为参数,但您也可以将猫或狗传入其中,因为猫和狗是动物。
答案 1 :(得分: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
的实际实现,它只需要它可以运行的东西。