Общее наследование и вызов GetMethod (). GetReturnType ()

В моем текущем проекте у меня есть классы, которые смоделированы следующим образом. В какой-то момент такой метод, как 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"
    }
}
6
задан Ryan Ransford 28 October 2011 в 15:54
поделиться