В моем текущем проекте у меня есть классы, которые смоделированы следующим образом. В какой-то момент такой метод, как getReturnTypeForGetId ()
, вызывается для классов A
и B
. Вызов метода с A
возвращает Integer
, как ожидалось, но B
возвращает Serializable
.
Что мне здесь не хватает? Меня укусила какая-то отвратительная штука стирания, или я просто упускаю какую-то общую контекстную затирание?
РЕДАКТИРОВАТЬ: Добавление переопределенного метода getId ()
в B
устраняет проблему, но мне все равно хотелось бы понять, с чем я столкнулся.
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"
}
}