Получение класса универсального параметра типа в Java - PullRequest
0 голосов
/ 06 июля 2019

У меня есть класс, который должен обрабатывать объекты, которые расширяют класс 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>(), узнать, что T является Integer?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...