Esta regla está destinada a evitar conflictos en el código heredado que todavía usa tipos sin formato.
Aquí hay una ilustración de por qué esto no estaba permitido, extraído del JLS. Supongamos que antes de que se introdujeran genéricos en Java, escribí un código como este:
class CollectionConverter {
List toList(Collection c) {...}
}
Extiendes mi clase, así:
class Overrider extends CollectionConverter{
List toList(Collection c) {...}
}
Después de la introducción de los genéricos, decidí actualizar mi biblioteca.
class CollectionConverter {
<T> List<T> toList(Collection<T> c) {...}
}
No estás listo para hacer ninguna actualización, así que dejas tu Overrider
clase sola. Para anular correctamente el toList()
método, los diseñadores del lenguaje decidieron que un tipo sin formato era "equivalente de anulación" a cualquier tipo genérico. Esto significa que aunque la firma de su método ya no es formalmente igual a la firma de mi superclase, su método todavía se anula.
Ahora, pasa el tiempo y decides que estás listo para actualizar tu clase. Pero te equivocas un poco y, en lugar de editar el toList()
método en bruto existente, agregas un método nuevo como este:
class Overrider extends CollectionConverter {
@Override
List toList(Collection c) {...}
@Override
<T> List<T> toList(Collection<T> c) {...}
}
Debido a la equivalencia de anulación de tipos sin formato, ambos métodos tienen una forma válida para anular el toList(Collection<T>)
método. Pero, por supuesto, el compilador necesita resolver un único método. Para eliminar esta ambigüedad, no se permite que las clases tengan múltiples métodos que sean equivalentes a la anulación, es decir, múltiples métodos con los mismos tipos de parámetros después del borrado.
La clave es que esta es una regla de idioma diseñada para mantener la compatibilidad con el código antiguo utilizando tipos sin formato. No es una limitación requerida por el borrado de los parámetros de tipo; debido a que la resolución del método se produce en tiempo de compilación, habría sido suficiente agregar tipos genéricos al identificador del método.