在Java中获取通用类型参数的类

时间:2019-07-06 20:58:22

标签: java generics

我有一个需要处理扩展Number类的对象的类。为此,我使用类型参数T。但是,该类中的某些函数需要知道T是什么类(例如,返回与T相同类的对象)。

随处可见的解决方案Class<T> clazz = (Class<T>) ((ParameterizedType) getClass().getSuperClass()).getActualTypeArguments()[0];看起来很有希望,因为我可以使用isAssignableFrom。但是,getActualTypeArguments[0]部分返回一个TypeVariableImpl,这显然意味着我需要做一些不同的事情。

更具体地说,我当前拥有的代码如下:

public class Outer {
    //Sole purpose of the Dummy class is for the getGenericSupertype() method.
    private static abstract class Dummy<T> {
        private Class<T> clazz;

        @SuppressWarnings("unchecked")
        public Dummy() {
            clazz = (Class<T>) ((ParameterizedType) 
                    getClass().getGenericSuperclass())
                    .getActualTypeArguments()[0]; //ClassCastException
        }

        public Class<T> getClazz() {
            return clazz;
        }
    }

    public static class Foo<T extends Number> extends Dummy<T> {
        private Class<T> typeOfNumber;
        //...

        public Foo() {
            typeOfNumber = getClazz();
            //...
        }

        public Foo(T number) {
            this();
            //...
        }
        //...

        private boolean isA(Class<?> type) {
            return type.isAssignableFrom(typeOfNumber);
        }

        public T toThisType(double x) {
            if(isA(Integer.class))
                return new Integer((int) x);
            //...
        }
    }

    //Several functions that use Foo were omitted for brevity.
}

我打算在其他类中扩展Outer,然后为某些操作创建Foo对象。如果可能,我不想在任何构造函数中放入类似Class<T> clazz的内容。简而言之,声明为new Foo<Integer>()的对象是否可以知道TInteger

0 个答案:

没有答案