java运行时获得泛型类型 傷城~ 2022-01-05 06:05 221阅读 0赞 ## 引言 ## 众所周知,java泛型最重要的特征是泛型擦除,所有泛型在编译时会转换成Object所以在java中运行时无法获得泛型的类型。 但是其实以上的规则是针对方法的内部变量的,如果是其他形式的泛型其实是可以获得内部类型的 ## 类内部成员变量 ## public static void main(String[] arg) throws NoSuchFieldException, SecurityException{ Field f=Pojo.class.getField("list"); //反射获得泛型成员变量 System.out.println(f.getGenericType()); //输出成员变量类型 Type[] type=((ParameterizedType)f.getGenericType()).getActualTypeArguments(); //获得泛型的所有泛型参数 for(Type t:type){ System.out.println(t); //遍历输出各个参数 } } public static class Pojo{ public List<String> list; //泛型成员变量 } -----------输出------------- java.util.List<java.lang.String> class java.lang.String ## 泛型父类/接口 ## public static void main(String[] arg) throws NoSuchFieldException, SecurityException{ List l=new ArrayList<String>(){}; //创建一个ArrayList内部类 注意这里后面加了{}是内部类而不是简单的arraylist System.out.println(l.getClass().getGenericSuperclass()); //输出泛型父类 Type[] t2=((ParameterizedType)l.getClass().getGenericSuperclass()).getActualTypeArguments(); //获得泛型的所有泛型参数 for(Type t:t2){ System.out.println(t); //遍历输出各个参数 } } -----------输出------------- java.util.ArrayList<java.lang.String> class java.lang.String 这里的list是继承ArrayList<String>的子类,其父类是ArrayList<String>,只有父类/父接口拥有泛型参数才可以获得对应的泛型参数,直接写new ArrayList<String>()的输出结果就会是 java.util.AbstractList<E> E 就无法获得泛型类型 ## 应用 ## 看到这里来说下以上功能的用处,最常见的用处是用于数据解析,比如jackson ObjectMapper mapper = new ObjectMapper(); map = mapper.readValue(input, new TypeReference<Map<String, Object>>(){}); 就是通过实现TypeReference接口产生子类来传递泛型参数的(同样后面带着\{\})来告诉框架期望转换成什么样的对象 ## 总结 ## JDK保存这些信息想必是因为类继承时会需要相应泛型的范围是否正确,在日常开发中需要通过泛型传递类型可以用本文的方法 > * 泛型成员变量 > * 泛型父类/接口 来实现。 转载于:https://www.cnblogs.com/resentment/p/6093284.html
相关 Java泛型使用误区:类型擦除和运行时类型检查 在Java编程中,泛型是Java提供的一种强大的类型机制。然而,使用泛型时可能会出现一些误区,其中就包括类型擦除和运行时类型检查。 1. 类型擦除: - 误以为泛型提供 柔情只为你懂/ 2024年09月18日 13:27/ 0 赞/ 2 阅读
相关 Java泛型:如何避免运行时类型转换异常 在Java中,泛型是一种类型参数化的机制,它允许你创建可以处理多种类型的类或方法。然而,如果没有正确地使用或者理解泛型的特性,确实可能会导致运行时类型转换异常。 以下是一些避 一时失言乱红尘/ 2024年09月16日 21:39/ 0 赞/ 11 阅读
相关 Java泛型:如何避免运行时类型不安全问题 Java泛型确实为编程提供了一种类型安全的手段,但是如果不正确地使用,依然可能会导致运行时类型不安全的问题。以下是一些避免此类问题的方法: 1. 明确使用泛型:在定义类或方法 素颜马尾好姑娘i/ 2024年09月15日 22:57/ 0 赞/ 11 阅读
相关 Java泛型使用:类型擦除及运行时错误示例 在Java中,泛型是一种在编译时确定类型的技术。尽管在编译阶段类型是固定的,但在运行时,由于"类型擦除"(Type Erasure),原始的泛型类型将被擦除,只剩下基本类型的引 电玩女神/ 2024年09月11日 15:30/ 0 赞/ 20 阅读
相关 Java泛型使用:类型擦除与运行时错误 在Java编程中,泛型是一种强大的工具,它允许我们在创建集合(如List、Set等)或数组时指定类型,但在编译阶段就将具体的类型替换为Object。 1. 类型擦除:当我们将 青旅半醒/ 2024年09月05日 19:33/ 0 赞/ 16 阅读
相关 Java 运行时如何获取泛型参数的类型 在 Java 中对于下面最简单的泛型类 > class A<T> \{ > public void foo() \{ > //如何在此处获得运 ╰+攻爆jí腚メ/ 2022年09月30日 15:51/ 0 赞/ 195 阅读
相关 Java 运行时如何获取泛型参数的类型 在 Java 中对于下面最简单的泛型类 > class A<T> \{ > public void foo() \{ > //如何在此处获得运行时 T 的具体类型呢? 小灰灰/ 2022年06月10日 13:46/ 0 赞/ 241 阅读
相关 java运行时获得泛型类型 引言 众所周知,java泛型最重要的特征是泛型擦除,所有泛型在编译时会转换成Object所以在java中运行时无法获得泛型的类型。 但是其实以上的规则是针对方法的内部 傷城~/ 2022年01月05日 06:05/ 0 赞/ 222 阅读
相关 Java 运行时如何获取泛型参数的类型 [https://blog.csdn.net/hj7jay/article/details/54889717][https_blog.csdn.net_hj7jay_artic 末蓝、/ 2021年09月15日 04:30/ 0 赞/ 276 阅读
还没有评论,来说两句吧...