En mi proyecto actual, tengo clases que se modelan de la siguiente manera. En algún momento, se llama a un método como getReturnTypeForGetId()
en las clases A
y B
. Llamar al método con A
devuelve Integer
como se esperaba, pero B
devuelve Serializable
.Herencia y llamadas genéricas GetMethod(). GetReturnType()
¿Qué me falta aquí? ¿Estoy siendo mordido por alguna cosa de borrado atroz, o simplemente me estoy perdiendo de algún tipo de engatusamiento de contexto genérico?
EDIT: Adición de una sobre-montado getId()
método para B
corrige el problema, pero todavía me gustaría entender lo que estoy corriendo en.
import java.io.Serializable;
public class WeirdTester {
static interface Identifiable<T extends Serializable> {
T getId();
void setId(final T id);
}
static abstract class BaseEntity<T extends Serializable> implements Identifiable<T> {
private T id;
public T getId() { return id; }
public void setId(final T id) { this.id = id; }
}
static class A implements Identifiable<Integer> {
private Integer id;
public Integer getId() { return id; }
public void setId(final Integer id) { this.id = id; }
}
static class B extends BaseEntity<Integer> {}
@SuppressWarnings("unchecked")
private static <T extends Serializable, Q extends Identifiable<T>> Class<T> getReturnTypeForGetId(
final Class<Q> clazz) throws Exception {
return (Class<T>) clazz.getMethod("getId", (Class[])null).getReturnType();
}
public static void main(final String[] args) throws Exception {
System.out.println(getReturnTypeForGetId(A.class));
// CONSOLE: "class java.lang.Integer"
System.out.println(getReturnTypeForGetId(B.class));
// CONSOLE: "interface java.io.Serializable"
}
}
¿No sería más fácil lograr lo que está intentando con tokens de tipo súper? http://gafter.blogspot.com/2006/12/super-type-tokens.html – millimoose