java - 为什么在这个语句中使用{}来实例化,Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();

标签 java initialization json-deserialization

请解释为什么 {} 用于

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();

这来自 Gson 文档 link to documentation

最佳答案

它正在创建一个新的匿名类型。这是类型删除的解决方法,因为您可以获得 Collection<Integer>通过 Class.getGenericSuperclass() 反射(reflection)和 Class.getGenericInterfaces()如果类不是通用的 (*)。

这段代码基本上实现了相同的功能Ideone demo :

abstract class TypeToken<T> {
  Type getType() {
    ParameterizedType t = (ParameterizedType) getClass().getGenericSuperclass();
    return t.getActualTypeArguments()[0];
  }
}

public static void main (String[] args) {
    Collection<Integer> list = new ArrayList<>();
    System.out.println(list.getClass().getGenericInterfaces()[0]);

    TypeToken<Collection<Integer>> tt = new TypeToken<Collection<Integer>>() {};

    System.out.println(tt.getClass().getGenericSuperclass());
    System.out.println(tt.getType());
}

输出:

java.util.List<E>
Ideone.Ideone$TypeToken<java.util.Collection<java.lang.Integer>>
java.util.Collection<java.lang.Integer>

您可以看到 Collection 的“整数”特性丢失了;但它仍然存在于 TypeToken 中, 所以你可以通过 getType() 得到它方法。


(*) 这里很重要的一点是您不能(正确地)创建 TypeToken在通用方法中。例如:

<T> TypeToken<T> getGenericToken() {
  return new TypeToken<T>() {};
}

不会像您预期的那样工作 Ideone demo .

TypeToken<Collection<String>> t = getGenericToken();
System.out.println(t.getType()); // T, not Collection<String>.

关于java - 为什么在这个语句中使用{}来实例化,Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47691731/

相关文章:

java - 图像为空时数据未插入数据库

java - 重用初始化耗时的Swing组件

c# - 使用 System.Text.Json 反序列化形状奇怪的数据

java - JSON 字符串到集合 Java

java - 如何使用spring jdbc获取n条记录

java - 从旧 Java 过渡到 Play、Servlet 问题

c# - 基本成员初始化部分 C#?

ios - 初始化 UIView 子类属性如何影响 superview 的中心?

java - jackson 注释JsonFormat $ Value json java.lang.NoSuchMethodError

java - 在 javax.mail.MimeMessage 中设置发件人名称?