如何获取泛型的Type类型
阅读(1439)
2017-11-28
开发中很多时候都遇到或使用到泛型。例如在json转换成bean对象或其他对象,而对象中存在泛型,这时候需要用到TypeToken。
Type:是java里的 java.lang.reflect.Type;
TypeToken:是guava提供的抽象类能够获取泛型类型
开门见山
通过TypeToken获取泛型Type类型
TypeToken typeToken = new TypeToken<ArrayList<User<String>>>(){};
Type type = typeToken.getType();举个栗子
例如通过JSON字符串转换成对象 且 还要保持原有类型(包括泛型类型)
1、模拟数据列表
//模拟数据列表
List<User<String>> list = new ArrayList<User<String>>();
list.add(new User<String>(1,"hello"));
list.add(new User<String>(2,"world"));
String json = JSONArray.toJSONString(list);
System.out.println(json);
//输出:[{"id":1,"name":"hello"},{"id":2,"name":"world"}]2、不使用TypeToken
//我们来看看不使用TypeToken的情况
List<User<String>> result1 = JSONArray.parseObject(json, list.getClass());
System.out.println(result1);
//输出:[{"id":1,"name":"hello"}, {"id":2,"name":"world"}]看下图,使用调试看到,执行完result1的时候看到:result1对象为ArrayList,User对象不能正常转化类型为JSONObject,User对象属性变了HashMap了。

3、使用TypeToken
//再来看看使用TypeToken的情况 List<User<String>> result2 = JSONArray.parseObject(json, type); System.out.println(result2.get(0).getName().getClass()); //输出:[com.weizhixi.test.User@db8155, com.weizhixi.test.User@107f7fe] //输出:class java.lang.String
再来下图,使用调试看到,执行完result2的时候看到:result2象为ArrayList,User对象已经正常转化类型为User,User对象属性也是对的。

最后
给出完整demo代码
Test.java
package com.weizhixi.test;
import com.alibaba.fastjson.JSONArray;
import com.google.common.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
/**
* Created by cxq on 2017-11-27.
*/
public class Test {
public static void main(String[] arg0){
//泛型类型
TypeToken typeToken = new TypeToken<ArrayList<User<String>>>(){};
Type type = typeToken.getType();
//模拟数据列表
List<User<String>> list = new ArrayList<User<String>>();
list.add(new User<String>(1,"hello"));
list.add(new User<String>(2,"world"));
String json = JSONArray.toJSONString(list);
System.out.println(json);
//输出:[{"id":1,"name":"hello"},{"id":2,"name":"world"}]
//我们来看看不使用TypeToken的情况
List<User<String>> result1 = JSONArray.parseObject(json, list.getClass());
System.out.println(result1);
//输出:[{"id":1,"name":"hello"}, {"id":2,"name":"world"}]
//再来看看使用TypeToken的情况
List<User<String>> result2 = JSONArray.parseObject(json, type);
System.out.println(result2);
System.out.println(result2.get(0).getName().getClass());
//输出:[com.weizhixi.test.User@db8155, com.weizhixi.test.User@107f7fe]
//输出:class java.lang.String
}
}User.java
package com.weizhixi.test;
/**
* Created by cxq on 2017-11-27.
*/
public class User<T>{
private Integer id;
private T name;
public User(){
}
public User(Integer id, T name){
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
}本例子需使用的jar包有:
fastjson-1.1.41.jar
guava-16.0.1.jar
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>16.0.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.41</version> </dependency>
已下载:216 次
原创文章,转载请注明出处:https://www.weizhixi.com/article/7.html
