AFAIK, mi clase extends
, clases e implements
interfaces para padres . Pero me encuentro con una situación en la que no puedo usar implements SomeInterface
. Es la declaración de un tipo genérico. Por ejemplo:
public interface CallsForGrow {...}
public class GrowingArrayList <T implements CallsForGrow> // BAD, won't work!
extends ArrayList<T>
Aquí el uso implements
está sintácticamente prohibido. Primero pensé que está prohibido usar la interfaz dentro de <>, pero no. Es posible, solo tengo que usar en extends
lugar de implements
. Como resultado, estoy "extendiendo" una interfaz. Este otro ejemplo funciona:
public interface CallsForGrow {...}
public class GrowingArrayList <T extends CallsForGrow> // this works!
extends ArrayList<T>
A mí me parece una inconsistencia sintáctica. ¿Pero tal vez no entiendo algunas sutilezas de Java 6? ¿Hay otros lugares donde debería extender las interfaces? ¿Debería la interfaz, que quiero extender, tener algunas características especiales?
fuente
extends
yimplements
, es solo cuando se mira el problema desde una perspectiva pura del sistema de tipos, que no hay diferencia.T
es una clase?T
podría hacer referencia a un tipo de interfaz o unenum
tipo.:
. y bajo las cubiertas, una interfaz es y siempre ha sido una clase abstracta con la restricción de contener soloabstract
miembros virtuales ( ) no implementados , para permitir la herencia múltiple. literalmente no hay diferencia entreimplements
yextends
. ambos podrían ser reemplazados por la misma palabra (extends
) o por algún símbolo arbitrario (:
) y no se perdería nada.Cuando Java 5, y en particular los genéricos, se pusieron inicialmente a disposición de los desarrolladores que habían registrado un interés, la sintaxis era bastante diferente. En lugar de
Set<? extends Foo>
ySet<? super Bar>
teníaSet<+Foo>
ySet<-Foo>
. Sin embargo, la respuesta fue que no estaba claro si+
significaba más específico o más amplio (más clases) . Sun respondió a esa retroalimentación cambiando la sintaxis, pero dentro de la restricción de no introducir nuevas palabras clave, lo que habría sido un problema para la compatibilidad con versiones anteriores.El resultado es que ninguno de los dos es bastante natural. Como observa,
extends
está sobrecargado para hablar de clases que "amplían" las interfaces, que no es el lenguaje utilizado en otros contextos; ysuper
se sobrecarga para significar "es una superclase de", que es la dirección opuesta de la relación expresada previamente por la palabra clave, es decir, se refiere a una superclase.Sin embargo, los fundamentos de lo que es una interfaz no se ven afectados por este cambio, y no introduce interfaces especiales que se extiendan de una manera nueva.
fuente
Existen desventajas en permitir y prohibir dicha sintaxis, y las de permitir son mucho mayores.
Solo piensa en ello.
La separación de la interfaz y la implementación es uno de los modismos fundamentales de programación. Debido a eso, la sintaxis que permite deletrear "la interfaz implementa algo" sería tan mala como la que usa el signo más para denotar la multiplicación de operandos.
fuente
Es necesario comprender la programación dirigida por la interfaz como el siguiente paso al comprender una interfaz. Indica cuál es el uso real de la interfaz. Qué papel juega en un programa Java (o cualquier otro lenguaje).
fuente