Me encontré con esto hoy y lo único que puedo pensar es que este es un error en el compilador de Java. El siguiente código se compila, pero ciertamente parece incorrecto (ya que testMethod tiene una firma differenet en el elemento secundario pero anula el elemento principal) y lanzará excepciones de lanzamiento de clase en el tiempo de ejecución.Agregar un genérico le permite anular un método con un tipo de devolución diferente?
public interface TestInterface<T> {
public List<String> testMethod(); // <-- List<String>
}
public class TestClass implements TestInterface {
@Override
public List<Integer> testMethod() { // <-- List<Integer> overriding List<String>!!
return Collections.singletonList(1);
}
}
Y el uso de la estructura anterior:
public void test() {
TestInterface<Boolean> test = new TestClass();
List<String> strings = test.testMethod();
for (String s : strings) {
System.out.println(s);
}
}
Todo esto compila bien, pero obviamente habrá lanzar excepciones elenco de clase si lo ejecuta.
Si quita <T>
de TestInterface
, o de relleno en T
en la línea TestClass implements TestInterface<T>
entonces el código ya no se compilará, lo cual tiene sentido. Imo <T>
no debería tener relación con la compilación de testMethod
ya que no forma parte de ese método. Tal vez añadiendo <T>
a TestInterface está causando el compilador para escribir-borrar las firmas de método a pesar de que T
no participa en esos métodos ...?
¿Alguien sabe lo que está pasando aquí?
+1. Tiene que ser algo muy extraño, realmente extraño, en la implementación genérica –