Подтвердить что ты не робот

Что такое параметрический полиморфизм в 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: если мой пример не показывает специфический параметрический полиморфизм, пожалуйста, вы можете его предоставить? спасибо.

4b9b3361

Ответ 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

Точно. Параметрический полиморфизм обычно относится к дженерикам/шаблонам.

Из Википедии:

Используя параметрический полиморфизм, функция или тип данных могут быть записаны в общем виде, так что они могут обрабатывать значения одинаково, не завися от их типа.