¿Por qué se permite "extiende T" pero no "implementa T"?

Resuelto user120623 asked hace 15 años • 0 respuestas

¿Existe alguna razón especial en Java para usar siempre " extends" en lugar de "?implements " para definir límites de parámetros de tipo?

Por ejemplo:

public interface C {}
public class A<B implements C>{} 

está prohibido, pero

public class A<B extends C>{} 

es correcto. ¿Cuál es la razón para eso?

user120623 avatar Jun 10 '09 22:06 user120623
Aceptado

No hay diferencia semántica en el lenguaje de restricciones genéricas entre si una clase "implementa" o "extiende". Las posibilidades de restricción son 'extiende' y 'super', es decir, esta clase con la que operar es asignable a esa otra (extiende), o esta clase es asignable desde esa (super).

Tetsujin no Oni avatar Jun 10 '2009 15:06 Tetsujin no Oni

La respuesta está aquí  :

Para declarar un parámetro de tipo limitado, indique el nombre del parámetro de tipo, seguido de la extendspalabra clave, seguido de su límite superior […]. Tenga en cuenta que, en este contexto, extend se usa en un sentido general para significar extends(como en clases) o implements(como en interfaces).

Ahí lo tienes, es un poco confuso y Oracle lo sabe.

MikaelF avatar Nov 03 '2016 02:11 MikaelF

Probablemente porque para ambas partes (B y C) sólo el tipo es relevante, no la implementación. en tu ejemplo

public class A<B extends C>{}

B también puede ser una interfaz. "extiende" se utiliza para definir subinterfaces y subclases.

interface IntfSub extends IntfSuper {}
class ClzSub extends ClzSuper {}

Normalmente pienso en 'Sub extiende Super' como ' Sub es como Super , pero con capacidades adicionales', y 'Clz implementa Intf' como ' Clz es una realización de Intf '. En su ejemplo, esto coincidiría: B es como C , pero con capacidades adicionales. Aquí son relevantes las capacidades, no la realización.

beetstra avatar Jun 10 '2009 16:06 beetstra

Aquí hay un ejemplo más complicado de dónde se permiten extensiones y posiblemente lo que desea:

public class A<T1 extends Comparable<T1>>

ntg avatar Jul 31 '2012 13:07 ntg

Puede ser que el tipo base sea un parámetro genérico, por lo que el tipo real puede ser una interfaz de una clase. Considerar:

class MyGen<T, U extends T> {

Además, desde la perspectiva del código del cliente, las interfaces son casi indistinguibles de las clases, mientras que para el subtipo es importante.

Tom Hawtin - tackline avatar Jun 10 '2009 15:06 Tom Hawtin - tackline