Что такое параметрический полиморфизм в Java (с примерами)?
Я понимаю, что параметрический полиморфизм - это метод, который позволяет единообразные действия над множеством данных (типов). Правильно ли я знаю?
Является ли этот пример параметрическим полиморфизмом?
Я считаю, что с тех пор, как Animal.talk позволяет говорить, что называется, несмотря на определенный тип животных (Cat или Dog).
public interface Animal
{
public String talk();
}
public class Cat implements Animal
{
public String talk()
{
return "Cat says Meow!";
}
}
public class Dog implements Animal
{
public String talk()
{
return "Dog says Woof! Woof!";
}
}
import java.util.*;
public class PolymorphismExample
{
public static void main(String[] args)
{
Collection<Animal> animals = new ArrayList<Animal>();
animals.add(new Cat());
animals.add(new Dog());
for (Animal a : animals)
{
System.out.println(a.talk());
}
}
}
С уважением.
edit: если мой пример не показывает специфический параметрический полиморфизм, пожалуйста, вы можете его предоставить? спасибо.
Ответы
Ответ 1
"Параметрический полиморфизм" - это еще один термин для "Generics" в Java. Идея проста: вы указываете, какие типы будут использоваться определенным классом, ясный пример этого присутствует во всех коллекциях пакета java.util
.
Для изучения всех нюансов дженериков в Java я настоятельно рекомендую Angelika Langer FAQ, он исследует каждый угол спецификации.
В вашем коде эта строка является примером использования дженериков:
Collection<Animal> animals = new ArrayList<Animal>();
Указана коллекция для хранения любого объекта, являющегося животным.
Ответ 2
Википедия:
В языках программирования и теории типов параметрический полиморфизм - это способ сделать язык более выразительным, сохраняя при этом полную статическую безопасность. Используя параметрический полиморфизм, функция или тип данных могут быть записаны в общем случае, чтобы они могли обрабатывать значения одинаково, не завися от их типа. Такие функции и типы данных называются родовыми функциями и родовыми типами данных соответственно и составляют основу общего программирования.
Итак, отличный пример - стандартные коллекции библиотек Java.
Например, Collections.sort
объявляется как:
public static <T extends Comparable<? super T>> void sort(List<T> list)
Он может взять список объектов типа T
, сопоставимый с другим T
, и отсортировать список, не беспокоясь о том, какой тип T
на самом деле.
Это отличается от полиморфизма подтипа: полиморфизм подтипа иллюстрируется тем фактом, что sort
может принимать любые List
- a ArrayList
, a LinkedList
и т.д.
Ответ 3
Точно. Параметрический полиморфизм обычно относится к дженерикам/шаблонам.
Из Википедии:
Используя параметрический полиморфизм, функция или тип данных могут быть записаны в общем виде, так что они могут обрабатывать значения одинаково, не завися от их типа.