java - móviles - manual de programacion android pdf
Tipo borrado, anulación y genéricos (2)
La firma de fooMethod(Class<?>)
Es la misma que la firma de fooMethod(Class)
después del borrado, ya que el borrado de Class<?>
Es simplemente Class
( JLS 4.6 ). Por lo tanto, fooMethod(Class)
es una subsigna de fooMethod(Class<?>)
Pero no lo opuesto ( JLS 8.4.2 ).
Para sobrescribir con métodos de instancia, necesita que el método de anulación sea una subscripción del método reemplazado ( JLS 8.4.8.1 ). Este no es claramente el caso aquí.
Ahora que hemos establecido el hecho de que su método de subclase no anula el método de la superclase de acuerdo con el JLS, veamos las implicaciones de tiempo de ejecución cuando se ha producido el borrado de tipos. Ahora tenemos dos métodos que se ven exactamente iguales (el mismo nombre, los mismos tipos de parámetros) pero que no se anulan entre sí. Si no anulan, deben estar ambos disponibles en el subtipo como métodos separados, pero tienen firmas de tiempo de ejecución idénticas: conflicto. Entonces Java tiene que rechazarlo.
Se permite anular los tipos de parámetros genéricos utilizando tipos de parámetros sin formato porque existen tipos sin procesar solo por esta razón: son un mecanismo conveniente con reglas de tipos de datos no válidos específicos para acomodar la interacción con el código heredado. Entonces, el sistema de tipo aquí decidirá que el método de la subclase reemplaza a la superclase, son idénticos después del borrado de tipo y nunca podemos tener un conflicto. Como consecuencia de esto, las bibliotecas pueden ser generadas independientemente del código no genérico existente.
¿Puede alguien explicarme por qué?
@Override
public void fooMethod(Class<?> c)
no anula
public void fooMethod(Class c)
y me da los siguientes errores en su lugar:
- Name clash: The method fooMethod(Class<?>) of type SubClass has the same erasure as fooMethod(Class) of type SuperClass but does not override it - The method fooMethod(Class<?>) of type SubClass must override a superclass method
?
Editar: " java -version
" dice Java (TM) 2 Runtime Environment, Standard Edition (compilación 1.5.0_16-b06-284). En cuanto al fragmento de código, ya está arriba, casi; lo anterior extiende el siguiente.
Porque Class<?>
Es más específico que solo Class
.
Por ejemplo, foo(Class<List>)
no puede anular foo(Class<Collection>)
. Olvidé el término, pero los tipos con genéricos siempre serán diferentes de los que no.