¿Por qué se permite "extiende T" pero no "implementa T"?
¿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?
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).
La respuesta está aquí :
Para declarar un parámetro de tipo limitado, indique el nombre del parámetro de tipo, seguido de la
extends
palabra clave, seguido de su límite superior […]. Tenga en cuenta que, en este contexto, extend se usa en un sentido general para significarextends
(como en clases) oimplements
(como en interfaces).
Ahí lo tienes, es un poco confuso y Oracle lo sabe.
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.
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>>
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.