为什么带有类型参数的泛型类<t>没有被强制转换为ParameterizedType

时间:2018-05-29 08:56:45

标签: java generics classcastexception

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 :(得分:2)

Class.getGenericSuperclass

  

返回表示此类所代表的实体(类,接口,基本类型或void)的直接超类的Type。

     

如果超类是参数化类型,则返回的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>