Концептуальная разница между параметрическим полиморфизмом и полиморфизмом подтипа?

Я попытался прочитать Википедию, но она настолько плотная на тему полиморфизма (особенно связанного с Java). Я понимаю, что полиморфизм подтипа связан с подтипом, а параметрический полиморфизм связан с методами, обобщаемыми для разных объектов / классов? Что я упускаю?

2 ответов


Как говорится в статье,

параметрический полиморфизм позволяет функции или тип данных быть записаны в общем виде, так что он может обрабатывать значения одинаково без зависимости от их типа ... Параметрический полиморфизм также доступен в нескольких объектно-ориентированных языках, где он часто идет под названием " generics "(например, Java) или" templates " (C++ и D)

Итак, что это означает (в качестве примера), вы можете сделать функцию, которая принимает список что-то, и функция может работать независимо от того, что эти что-то есть. Придумать метод, который возвращает количество элементов в коллекции. Вы можете передать список элементов любого типа, и он вернет ответ. Вам не нужно переписывать функцию для каждого типа списка, который вы передаете.

некоторые языки используют идею подтипирования для ограничения диапазона типов, которые могут быть использованы в частном случае полиморфизма. На этих языках:полиморфизм подтипа (иногда называемый полиморфизмом включения или динамическим полиморфизмом[нужная цитата]) позволяет записать функцию, чтобы взять объект определенного типа T, но также работать правильно, если передан объект, который принадлежит типу S, который является подтипом T

другими словами, вы можете иметь метод, который принимает животное в качестве параметра, но вы также можете передать в него кошку или собаку потому что кошки и собаки-животные.


вы можете найти примеры в 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, ему просто нужно что-то, что он может запустить.