17
votes

It is my understanding that parametric polymorphism is a technique which allows uniform actions over a variety of data(types). Is my knowledge correct?

Is this example parametric polymorphism? I believe it is since Animal.talk allows talk to be called despite the specific animal type (Cat or 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());
    }
  }
}

Regards.

edit: if my example is not specifically exhibiting parametric polymorphism please would you provide one? thank you.

3
Looks correct. Basically, you treat Cat and Dog without regard for their actual type based on the Animal type.dvallejo
As a Haskeller, I wouldn't call that parametric polymorphism. A parametric polymorphic function would be something like LinkedList<T> reverse(LinkedList<T>) that works the same for all parameter types T. A parametric polymorphic function can't call interface methods.Daniel Fischer

3 Answers

24
votes

"Parametric Polymorphism" is just another term for "Generics" in Java. The idea is simple: you state what types will be used by a particular class, a clear example of this is present in all the collections of the java.util package.

For learning all the nuances of generics in Java, I highly recommend Angelika Langer's FAQ, it explores every corner of the specification.

In your code, this line is an example of using generics:

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

A collection is specified to hold any object that is an animal.

9
votes

Wikipedia:

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.

So a great example is the standard Java library collections.

For example, Collections.sort is declared as:

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

It can take a list of objects of type T that is comparable to other T's and sort the list, without worrying about what type T actually is.

It is different from subtype polymorphism: subtype polymorphism is exemplified by the fact that sort can take any sort of List -- an ArrayList, a LinkedList, etc.

5
votes

Precisely. Parametric polymorphism generally refers to generics/templates.

From wikipedia:

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.