El Java Language Specification, section 8.4.2 escribe:
Es un error de tiempo de compilación para declarar dos métodos con firmas de anulación en el equivalente (definido a continuación) en una clase.
Dos firmas de métodos m1 y m2 son anuladas-equivalentes si m1 es una subscripción de m2 o m2 es una subscripción de m1.
La firma de un m1 método es un subsignature de la firma de un m2 método si bien
Claramente, los métodos no se anulan equivalente, ya que no es ArrayList<String>
ArrayList
(el borrado de ArrayList<Integer>
).
Entonces, declarar los métodos es legal. Además, la expresión de invocación del método es válida, ya que trivialmente es un método más específico, ya que solo hay un método que coincide con los tipos de argumento.
Editar: Yishai correctamente señala que hay otra restricción muy cercada en este caso. El Java Language Specification, section 8.4.8.3 escribe:
Se trata de un error de tiempo de compilación si una declaración de tipo T tiene un método miembro de m1 y no existe un método m2 declarada en T o un supertipo de T tal que todas las siguientes condiciones mantener:
- m1 y m2 tienen el mismo nombre.
- m2 es accesible desde T.
- La firma de m1 no es una subscripción (§8.4.2) de la firma de m2.
- m1 o algunas sustituciones del método m1 (directa o indirectamente) tienen el mismo borrado que m2 o algunas sustituciones del método m2 (directa o indirectamente).
Apéndice: En ersure, y la falta de ella
Contrariamente a la noción popular, los genéricos en firmas de método no se borran. Los genéricos se borran en bytecode (el conjunto de instrucciones de la máquina virtual Java). Las firmas de métodos no son parte del conjunto de instrucciones; se escriben en el archivo de clase como se especifica en el código fuente. (Por otro lado, esta información también se puede consultar en tiempo de ejecución mediante reflexión).
Piense en esto: Si los parámetros de tipo fueron borrados de los archivos de clase en su totalidad, ¿cómo podría la finalización de código en el IDE de la pantalla elección que ArrayList.add(E)
toma un parámetro de tipo E
, y no Object
(= el borrado de E
) si no tenías el código fuente JDK adjunto? ¿Y cómo sabe el compilador lanzar un error de compilación cuando el tipo estático del argumento del método no era un subtipo de E
?
Si se trata de un caso de uso real, recomendaría solo un método 'public A getFirst (ArrayList ss) {return ss.get (0); } '... si solo se ha creado con fines ilustrativos, continúe –
¿Cuál es el error de compilación en eclipse? – meriton
¿Puedes citar los artículos? – trashgod