2012-04-16 115 views
13

Tengo entendido que el polimorfismo paramétrico es una técnica que permite acciones uniformes sobre una variedad de datos (tipos). Es mi conocimiento correcto?¿Qué es el polimorfismo paramétrico en Java (con ejemplo)?

¿Este ejemplo es un polimorfismo paramétrico? Creo que es porque Animal.talk permite que se llame a pesar del tipo de animal específico (gato o perro).

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

Saludos.

editar: si mi ejemplo no muestra específicamente el polimorfismo paramétrico, ¿podría proporcionar uno? gracias.

+0

Se ve correcto. Básicamente, tratas a Cat y Dog sin tener en cuenta su tipo real basado en el tipo de Animal. – dvallejo

+2

Como un Haskeller, no llamaría a ese polimorfismo paramétrico. Una función paramétrica polimórfica sería algo así como 'LinkedList reverse (LinkedList )' que funciona igual para todos los _parameter_ types 'T'. Una función polimórfica paramétrica no puede llamar a métodos de interfaz. –

Respuesta

18

"Polimorfismo paramétrico" es simplemente otro término para "genéricos" en Java. La idea es simple: usted indica qué tipos de serán utilizados por una clase particular, un claro ejemplo de esto está presente en todas las colecciones del paquete java.util.

Para aprender todos los matices de los genéricos en Java, recomiendo encarecidamente FAQ de Angelika Langer, explora cada rincón de la especificación.

En su código, esta línea es un ejemplo del uso de genéricos:

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

se especifica Una colección para contener cualquier objeto que es un animal.

3

Precisamente. El polimorfismo paramétrico generalmente se refiere a genéricos/plantillas.

de Wikipedia:

Utilización de polimorfismo paramétrico, una función o un tipo de datos se puede escribir genéricamente de manera que pueda manejar valores idénticamente sin dependiendo de su tipo.

+2

¿por qué esta página: http://en.wikipedia.org/wiki/Polymorphism_(computer_science) muestra el ejemplo como un polimorfismo de subtipo? ¿Cuál es la diferencia entre el polimorfismo de subtipo y el polimorfismo paramétrico? –

+0

@DannyRancher Lo que hiciste, pensándolo bien, se asemeja más al subtipo de polimorfismo (polimorfismo basado en la herencia). El polimorfismo paramétrico es cuando escribe cualquier clase o función utilizando genéricos, de modo que funciona para más de una clase que puede recibir como un parámetro genérico (por ejemplo, LinkedList ). –

+0

@DannyRancher Agregué algunos detalles a mi respuesta para aclarar la diferencia. – trutheality

6

Wikipedia:

En lenguajes de programación y la teoría de tipos, polimorfismo paramétrico es una manera de hacer un lenguaje más expresivo, mientras que todavía mantiene plena seguridad de tipos estática. Al usar polimorfismo paramétrico, una función o un tipo de datos se puede escribir genéricamente para que pueda manejar los valores de forma idéntica sin depender de su tipo. Tales funciones y tipos de datos se denominan funciones genéricas y tipos de datos genéricos respectivamente y forman la base de la programación genérica.

Así que un buen ejemplo es la colección de bibliotecas estándar de Java.

Por ejemplo, Collections.sort se declara como:

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

Se pueden tomar una lista de objetos de tipo T que es comparable a otros T 's y ordenar la lista, sin preocuparse de qué tipo T realidad es .

Es diferente de polimorfismo subtipo: polimorfismo de subtipo está ejemplificado por el hecho de que sort puede tomar cualquier tipo de List - un ArrayList, un LinkedList, etc.

Cuestiones relacionadas