Почему универсальный класс <t>с параметром типа не приводится к ParameterizedType - PullRequest
0 голосов
/ 29 мая 2018
public class JAXBUtil<T> {


    @SuppressWarnings("unchecked")
    public T xmlPathToObj(final String FilePath) throws JAXBException {
         Class<T> classType = ((Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);    
    }
}

Метод xmlPathToObj, Class classType = ((Class) ((ParameterizedType) this.getClass (). GetGenericSuperclass ()). GetActualTypeArguments () [0]);дает java.lang.ClassCastException: java.lang.Class не может быть приведен к java.lang.reflect.ParameterizedType.

1 Ответ

0 голосов
/ 29 мая 2018

Class.getGenericSuperclass

Возвращает тип, представляющий прямой суперкласс сущности (класс, интерфейс, тип примитива или пустота), представленный этим классом.

Если суперкласс является параметризованным типом , возвращаемый объект Type должен точно отражать фактические параметры типа, используемые в исходном коде.

Вы получаете тип суперкласса с этим,В вашем случае вы не определили суперкласс, поэтому он Object, а Object не является универсальным классом.

public class Test{

    public static void main(String args[]) throws IOException {   
         System.out.println(Test.class.getGenericSuperclass().getTypeName());
    }
}

java.lang.Object

Если вы расширяете параметризованный класс, вы можете получить правильный результат:

public class Test extends Generic<String>{

    public static void main(String args[]) throws IOException {
         System.out.println(Test.class.getGenericSuperclass().getTypeName());
    }
}

class Generic<T> { }

main.Generic <java.lang.String>

Поймите, что вам нужно использовать это внеуниверсальный класс для фактического получения значения.В универсальном классе вы не сможете восстановить тип.

public class Test<U> extends Generic<U>{

    public static void main(String args[]) throws IOException {
        System.out.println(new Test<Integer>().getClass().getGenericSuperclass().getTypeName());
    }
}

class Generic<T> {

}

main.Generic<U>

...