Me encontré con una situación en la que Java no estaba invocando el método que esperaba: Aquí está el caso de prueba mínima: (Lo siento, parece artificial: el escenario del "mundo real" es sustancialmente más complejo y hace mucho más sentido de un "¿por qué demonios harías ese?" punto de vista.)¿Cómo funciona el envío de métodos Java con Generics y clases abstractas?
Estoy especialmente interesado en por qué sucede esto, no me importa volver a diseñar las sugerencias. Tengo la sensación de que está en Java Puzzlers, pero no tengo mi copia a mano.
Véase la pregunta específica en elogia a prueba <T> .getValue() a continuación:
public class Ol2 {
public static void main(String[] args) {
Test<Integer> t = new Test<Integer>() {
protected Integer value() { return 5; }
};
System.out.println(t.getValue());
}
}
abstract class Test<T> {
protected abstract T value();
public String getValue() {
// Why does this always invoke makeString(Object)?
// The type of value() is available at compile-time.
return Util.makeString(value());
}
}
class Util {
public static String makeString(Integer i){
return "int: "+i;
}
public static String makeString(Object o){
return "obj: "+o;
}
}
La salida de este código es:
obj: 5
Ah ... pensé que los genéricos de Java se compilaban más como plantillas de C++. ¡Gracias! – rcreswick