反射获取list泛型_Java泛型:你一直用的泛型是伪泛型,你造么?
时间: 2023-09-27 18:08:33 浏览: 147
是的,Java中的泛型确实是伪泛型。在Java中,编译器会将泛型代码转换成非泛型代码,这个过程称为类型擦除。因此,在运行时,泛型类型参数信息会被擦除,只剩下原始类型。这意味着在运行时无法获取泛型类型信息。
但是,我们可以使用反射机制来获取泛型类型信息。可以通过以下步骤来获取List泛型类型信息:
1.先获取List的Class对象,例如:
```
Class clazz = List.class;
```
2.获取List的Type类型对象,例如:
```
Type type = clazz.getGenericInterfaces()[0];
```
3.获取Type类型对象中的泛型参数类型,例如:
```
ParameterizedType parameterizedType = (ParameterizedType) type;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
```
这样就能获取到List的泛型参数类型了。需要注意的是,如果List没有指定泛型类型,则无法获取泛型参数类型信息。
相关问题
Java反射获取List的泛型
要获取一个List的泛型类型,可以使用Java反射提供的Type接口的getActualTypeArguments()方法。
假设我们有一个List对象,其类型为List<String>,可以使用以下代码获取其泛型类型:
```
List<String> list = new ArrayList<String>();
Type type = list.getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();
Type actualType = actualTypeArguments[0];
System.out.println(actualType);
}
```
这段代码首先获取List对象的Class类型,然后调用getGenericSuperclass()方法获取其父类的Type类型。如果这个Type是ParameterizedType(即带有泛型参数的类型),则通过getActualTypeArguments()方法获取实际的泛型参数类型数组,这里我们只有一个泛型参数,所以直接获取数组的第一个元素即可。最后打印出来的结果应该是java.lang.String。
java list 泛型类型_java 动态判断List<T>(泛型类)的具体类型
在Java中,泛型是在编译时确定的,运行时无法获取泛型的具体类型。但是,可以通过一些技巧来动态判断List<T>的具体类型。
一个常见的做法是使用instanceof关键字来判断List中存储的元素类型,例如:
```java
List<?> list = new ArrayList<>();
if (list.get(0) instanceof String) {
// 处理字符串类型的列表
} else if (list.get(0) instanceof Integer) {
// 处理整数类型的列表
} else {
// 处理其他类型的列表
}
```
另一种做法是使用反射来获取List中元素的类型,例如:
```java
List<String> list = new ArrayList<>();
Class<?> clazz = list.getClass();
if (clazz.isAssignableFrom(List.class)) {
Type type = clazz.getGenericSuperclass();
if (type instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) type;
Type[] types = pt.getActualTypeArguments();
if (types[0] instanceof Class) {
Class<?> genericClazz = (Class<?>) types[0];
// 处理泛型类型
}
}
}
```
这种做法可以获取List的泛型类型,但是只适用于编译时已知泛型类型的情况。如果List的泛型类型是通配符或者是另一个泛型类型,则无法获取具体类型。
阅读全文