天天看点

new TypeToken<List>>(){}.getType() 是什么意思

1. 项目中代码:

List<AppVersion> redisList = new Gson().fromJson(json, new TypeToken<List<AppVersion>>(){}.getType());           

复制

2. fromJson方法就是下面这个方法,将一个Json数据转换为对象。

提供两个参数,分别是json字符串以及需要转换成对象的类型。

在我们项目中是把Json格式的数据转换成List<AppVersion> 类型。

@SuppressWarnings("unchecked")
  public <T> T fromJson(String json, Type typeOfT) throws JsonSyntaxException {
    if (json == null) {
      return null;
    }
    StringReader reader = new StringReader(json);
    T target = (T) fromJson(reader, typeOfT);
    return target;
  }           

复制

3. new TypeToken<List<AppVersion>>(){}.getType() ,这个位置要的参数是一个Type,表示是xxx类型,但是Type是个接口,如下:

public interface Type {
    /**
     * Returns a string describing this type, including information
     * about any type parameters.
     *
     * @implSpec The default implementation calls {@code toString}.
     *
     * @return a string describing this type
     * @since 1.8
     */
    default String getTypeName() {
        return toString();
    }
}           

复制

new XXX(); 这样是一个构造函数,但是接口是不能直接new的,所以这时用到了匿名内部类,实现接口成为一种具体的类型。

TypeToken,它是gson提供的数据类型转换器,可以支持各种数据集合类型转换。

先调用TypeToken<T>的构造器得到匿名内部类,再由该匿名内部类对象调用getType()方法得到要转换成的type,

在此就是得到的type就是列表类型:List<AppVersion>类型。

new TypeToken<List<AppVersion>>(){}.getType() 就是说要把Json数据转换成List<AppVersion>类型的结果。

4. 匿名内部类使用还有如:

<span style="color:#333333">new TypeToken<LinkedList<User>>(){}

匿名内部类常用在监听里面,比如我们给一个按钮加监听:

JButton btn = new JButton("test");
btn.addActionListener(new ActionListener() {
			
	public void actionPerformed(ActionEvent e) {
				
	}
});</span>           

复制

btn.addActionListener() 方法接受的是一个 ActionListener 类型的对象,而 ActionListener 是一个接口,不能直接 new。

所以本来这里该写一个类实现ActionListener接口,然后给他传参为实现类对象,

但是太麻烦了,我们直接在这里创建了那个实现类,之所以叫匿名,就是因为new的时候实现为一个类就直接调方法了,根本没有给这个类取名。

5. Gson提供的fromJson()方法是实现从Json数据到Java实体的方法,可以把Json数据转成单一实体对象类型、对象列表类型、其他结构类型。

比如:

第一种 json字符串为:[{“name”:”name0”,”age”:0}] 转成 Person 类型:

Person person = gson.fromJson(str, Person.class);           

复制

第二种,转换成列表类型:

List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());           

复制

6. 可能出现问题:

将整形数字1存入json串,经gson解析后,可能会变成1.0,这时要用第二种转换方式。才会得到我们想要的整形1。

参考:http://blog.csdn.net/alexxu1988/article/details/46685433

http://blog.csdn.net/jonemill/article/details/39084809