Java獲取泛型的類型

Java的泛型是使用的擦除法實現,泛型的定義只在編譯的時候有效,編譯以後是沒有保留泛型的類型信息的。
然而,擦除法的實現存在一些特列,在這些特例狀況下,Java會記錄泛型的類型信息,而且能夠經過反射的Api來獲取。
一)泛型繼承code

public class TypeTest {
    public static void main(String[] args) {
        doProxy(Lists.newArrayList(1), new Function<String, Integer>() {
            public List<String> execute(Integer request) {
                return Lists.newArrayList(String.valueOf(request));
            }
        });
    }

    //必須是class,interface獲取不到泛型
    abstract static class Function<T, F> {
        abstract List<T> execute(F request);
    }

    public static <T,F> List<T> doProxy(List<F> request, Function<T, F> function) {
        if (function.getClass().getGenericSuperclass() instanceof ParameterizedType) {
            Type mySuperClass = function.getClass().getGenericSuperclass();
            Type type = ((ParameterizedType) mySuperClass).getActualTypeArguments()[0];
            System.out.println(type);
            System.out.println(((ParameterizedType) mySuperClass).getActualTypeArguments()[1]);
        }
        List<T> list = Lists.newArrayList();
        for (F f : request) {
            list.addAll(function.execute(f));
        }
        return list;
    }
}

二)方法參數和返回值的泛型
由於須要先經過反射獲取Method對象,而反射獲取Method對象須要方法名和參數類型,因此
只能獲取List<T> method(Set<T> param),這種參數的泛型
不能獲取T method(T param),這種參數的泛型對象

method.getGenericParameterTypes()[0].getActualTypeArguments()[0]
method.getGenericReturnType().getActualTypeArguments()[0]

三)Field的泛型
同方法泛型的緣由
只能獲取List<T> field,這種屬性的泛型
不能獲取T field這種屬性的泛型繼承

field.getGenericType().getActualTypeArguments()[0]
相關文章
相關標籤/搜索