直接获取时获取不到的,类型被虚拟机擦除了
- 泛型的正常工作是依赖编译器在编译源码的时候,先进行类型检查,然后进行类型擦除并且在类型参数出现的地方插入强制转换的相关指令实现的。编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如List在运行时仅用一个List类型来表示。
为什么要进行擦除呢?这是为了避免类型膨胀
。
利用子类实现父类的泛型是可以的
如何才能获取到泛型的类型
必须具有真实类型的存在
泛型的类型是明确的如 (List <User> 是明确的,List<T> 是不明确的)
尝试
如果直接使用getClass等方法,会出现下面的情况
这个是获取不到类型的
但是换成下面的方式,便可以获取:使用下边这组大括号,这一点非常重要
换一种类型,一样的情况
所以,可以通过上面的方式去获取类型
上面的这种方法的思路为:利用子类实现父类的泛型是可以的
通过获取第一个元素去判断当前属于哪一种类型即可
很多情况下,按下面的思路去操作即可
public static void main(String[] args) {
List<String> strs = new ArrayList<>();
strs.add("xxx");
List<Integer> ins = new ArrayList<>();
ins.add(1);
List<Boolean> boos = new ArrayList<>();
boos.add(true);
List<Long> lons = new ArrayList<>();
lons.add(null);
System.out.println(((List<?>)strs).get(0) instanceof String);//true
System.out.println(((List<?>)ins).get(0) instanceof String);//false
System.out.println(((List<?>)boos).get(0) instanceof Boolean);//true
System.out.println(((List<?>)lons).get(0) instanceof Long);//false
}
其他的直接去判断,通过查找并尝试,没有找到符合我要求的,怎么通过上面的方法去暂时实现了