Вопрос по java – Что такое параметрический полиморфизм в Java (с примером)?

15

Насколько я понимаю, параметрический полиморфизм - это метод, который позволяет выполнять единообразные действия над различными данными (типами). Верны ли мои знания?

Является ли этот пример параметрическим полиморфизмом? Я полагаю, что так как Animal.talk позволяет говорить, несмотря на определенный тип животных (кошка или собака).

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());
    }
  }
}

С уважением.

редактировать: если мой пример не демонстрирует параметрический полиморфизм, пожалуйста, предоставьте его? благодарю вас.

Как Хаскеллер, я бы не назвал этот параметрический полиморфизм. Параметрическая полиморфная функция будет что-то вродеLinkedList<T> reverse(LinkedList<T>) это работает одинаково для всехparameter типыT, Параметрическая полиморфная функция не может вызывать методы интерфейса. Daniel Fischer
Выглядит правильно. По сути, вы относитесь к кошкам и собакам без учета их фактического типа в зависимости от типа животных. dvallejo

Ваш Ответ

3   ответа
20

«Параметрический полиморфизм»; это просто еще один термин для «Дженерики» на Яве. Идея проста: вы заявляете, чтоtypes будет использоваться конкретным классом, яркий пример этого присутствует во всех коллекцияхjava.util пакет.

Для изучения всех нюансов дженериков в Java, я настоятельно рекомендую Анжелику ЛангерЧасто задаваемые вопросы, он исследует каждый угол спецификации.

В вашем коде эта строка является примером использования обобщений:

Collection<Animal> animals = new ArrayList<Animal>();

Коллекция указана для хранения любого объекта, который является животным.

4

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

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

Using parametric polymorphism, a function or a data type can be written generically so that it can handle values identically without depending on their type.

@DannyRancher Я добавил некоторые детали в свой ответ, чтобы прояснить разницу.
почему эта страница:en.wikipedia.org/wiki/Polymorphism_(computer_science) показать пример как подтип полиморфизма тогда? В чем разница между полиморфизмом подтипа и параметрическим полиморфизмом? Danny Rancher
@DannyRancher То, что вы сделали, если подумать, больше похоже на полиморфизм подтипа (полиморфизм, основанный на наследовании). Параметрический полиморфизм - это когда вы пишете любой класс или функцию с использованием универсальных шаблонов, поэтому они работают более чем с одним классом, который он может получить в качестве универсального параметра (например, LinkedList & lt; T & gt;).
8

Википедия:

In programming languages and type theory, parametric polymorphism is a way to make a language more expressive, while still maintaining full static type-safety. Using parametric polymorphism, a function or a data type can be written generically so that it can handle values identically without depending on their type. Such functions and data types are called generic functions and generic datatypes respectively and form the basis of generic programming.

Так что отличный пример - стандартные коллекции библиотек Java.

Например,Collections.sort объявлен как:

public static <T extends Comparable<? super T>> void sort(List<T> list)

Может принимать список объектов типаT это сопоставимо с другимиTи сортируйте список, не беспокоясь о том, какой типT на самом деле

Это отличается от полиморфизма подтипа: полиморфизм подтипа иллюстрируется тем фактом, чтоsort может взять любой видList - анArrayList,LinkedList, так далее.

Похожие вопросы