Концептуальная разница между параметрическим полиморфизмом и полиморфизмом подтипа?
Я попытался прочитать Википедию, но она настолько плотная на тему полиморфизма (особенно связанного с 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
, ему просто нужно что-то, что он может запустить.