2012-06-10 23 views
10

¿Puede alguien decirme cuáles son las diferencias entre el primer y el segundo código? MaxPQ significa cola de prioridad, que es una colección de objetos "clave" que se pueden comparar entre sí.implementa vs extiende en genéricos en Java

Código 1:

public class MaxPQ<Key extends Comparable<Key>>{ 
... 
} 

Código 2:

public class MaxPQ<Key implements Comparable<Key>>{ 
... 
} 

El segundo código no compila, pero no es intuitivo para mí por qué necesitamos extender en lugar de implementar interfaces cuando se usa un genérico

+1

Una pregunta similar se puede encontrar en [aquí] [1]. [1]: http://stackoverflow.com/questions/976441/java-generics-why-is-extends-t-allowed-but-not-implements-t – krakover

Respuesta

10

La diferencia es bastante simple: el segundo fragmento de código no se compila y nunca lo hará. Con los genéricos, siempre usa extends, para ambas clases e interfaces. También se puede usar la palabra clave super, pero tiene una semántica diferente.

+0

gracias, es que hay una razón por eso? – Popcorn

+0

@MarkX: en realidad, así es como se diseñaron y especificaron los genéricos. ¿Sencillez? –

+3

@Mark Una de las razones es que 'Key 'podría ser una interfaz en sí misma y de repente se' extenderá 'nuevamente aunque Comparable sea una interfaz. Entonces, como no se puede obtener absolutamente bien en todos los casos, se prefiere ser inconsistente. – Voo

1

No hay implementos en genéricos. El segundo código no es válido. Es probable que confundir con:

public class MaxPQ implements Comparable<Key> { 
    ... 
} 
0

supongo que se decidió utilizar extends para ambas interfaces y clases, ya que en el caso de la declaración de la clase genérica que no hace ninguna diferencia es argumento de tipo ligado a la interfaz o clase.

Por supuesto, el significado de extends es bastante diferente de su uso típico en la definición de clase. Angelika Langer tiene buen texto sobre los diferentes significados de extends en Java: Does "extends" always mean "inheritance"?

Cuestiones relacionadas