He probado algunas cosas con parámetros acotados en métodos genéricos y descubrí un comportamiento extraño.
Sería genial si alguien pudiera explicar los dos errores en el siguiente fragmento de código.Parámetros enlazados de Java en métodos genéricos
Imagine que hay dos clases Class1
y Class2
ambas se extienden desde un BaseClass
. Class2
implementa una interfaz.
En Class1
, tengo un método que devuelve una instancia de Class2
de la siguiente manera:
public class Class2 extends BaseClass implements Interface {
@Override
public void method() {
System.out.println("test"); //$NON-NLS-1$
}
}
public class Class1 extends BaseClass {
public <T extends BaseClass & Interface> T getTwo() {
return new Class2();
// Error: Type mismatch: cannot convert from Class2 to T
}
public static void main(String[] args) {
Interface two = new Class1().getTwo();
// Error: Bound mismatch: The generic method getTwo() of type Class1 is
// not applicable for the arguments(). The inferred type Interface is
// not a valid substitute for the bounded parameter <T extends BaseClass
// & Interface>
System.out.println(two);
}
}
Parece que el mal uso de los medicamentos genéricos. En realidad, 'getTwo' debe tener el tipo de devolución simplemente' Class2', o 'BaseClass', o' Interface'. Si 'T' se define solo para un método, el compilador no puede saber qué clase sustituye exactamente a' T' en la línea 'new Class1(). GetTwo()'. Solo sería posible si 'getTwo' tuviera parámetros de entrada de este tipo. – DRCB