Gson TypeToken 是如何工作的?

2023-11-21

据我了解,在 Java 中,与 C# 中的泛型相反,泛型是编译时功能,并通过类型擦除来删除。那么,Gson 的TypeToken真的有效吗?它如何获得对象的泛型类型?


It's a trick!

来自 JLS §4.6(强调我的):

类型擦除是从类型(可能包括参数化类型和类型变量)到类型(永远不是参数化类型或类型变量)的映射。我们写|T|用于类型T的擦除。擦除映射定义如下:

参数化类型 (§4.5) G 的擦除是 |G|。

嵌套类型 T.C 的擦除是 |T|.C。

数组类型 T[] 的擦除是 |T|[]。

类型变量(第 4.4 节)的擦除是其最左边界的擦除。

所有其他类型的擦除就是类型本身。

因此,如果您声明一个具有其自身匿名子类的类,它会保留其参数化类型;它没有被删除。因此,请考虑以下代码:

import java.lang.reflect.ParameterizedType;
import java.util.Arrays;
import java.util.HashMap;

public class Erasure<T>
{
    public static void main(String...strings) {
      Class<?> foo = new Erasure<HashMap<Integer, String>>() {}.getClass();
      ParameterizedType t = (ParameterizedType) foo.getGenericSuperclass();
      System.out.println(t.getOwnerType());
      System.out.println(t.getRawType());
      System.out.println(Arrays.toString(t.getActualTypeArguments()));
    }
}

这输出:

null
class Erasure
[java.util.HashMap<java.lang.Integer, java.lang.String>]

请注意,您将得到一个ClassCastException如果由于删除而没有匿名声明该类;超类不会是参数化类型,它会是Object.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gson TypeToken 是如何工作的? 的相关文章

随机推荐

  • Android ICS 原生锁屏

    这两天我一直在SW google等上寻找 我正在寻找一种方法来实现原生 Android ICS 锁屏附带的活动 如下面的屏幕所示 这些屏幕来自专业玩家但我注意到其他玩家也 玩家专业版例如 具有看起来完全相同的相同功能 这就是为什么我认为它是
  • 在 Markdown 元素之间转换

    解析 Markdown 文档并处理其元素以输出另一个 Markdown 文档的选项有哪些 咱们来说说吧 unaffected H1 H1 H2 H2 H3 应转换为 unaffected H1 H1 H2 H2 H3 在节点环境中 目标元素
  • 如何使用jquery查找数组中的重复项

    我有一个 jQuery 数组 var arr input name recordset 我得到的数组值是 8 或 6 如果数组值重复或重复 我需要显示 请不要重复这些值 如果没有 我需要进一步进行 有人能告诉我如何使用 jQuery 查找重
  • 无法在 python 3.7 中安装 http 模块

    在尝试使用 pip 安装 http 模块时 出现以下错误并且无法解决它 pip 安装 http ImportError cannot import name Request from request Users venv lib pytho
  • 嵌套有界通配符

    当我尝试编译以下代码时 LinkedList
  • NSTextField输入键检测或firstResponder检测

    我有两个NSTextFields textFieldUserID and textFieldPassword For textFieldPassword 我有一个代表如下 void controlTextDidEndEditing NSNo
  • 在 Room DAO 中与 Kotlin 协程一起使用 Deferred<...>

    我正在尝试在 Android 项目中将协程与 Room 数据库一起使用 我在网上几乎找不到任何文档 我想知道是否可以退货Deferred lt gt 这些方法中的类型 像这样的东西 Dao interface MyObjectDAO Que
  • GUI 中监听器的嵌套类的优点

    对于规模相当大的项目 我被告知 当您有扩展 JPanel 的类时 最佳实践是使用嵌套类来实现侦听器 例如 我可以有一个扩展 JPanel 的 FactoryScreen 类 并有一个实现所有必要侦听器的嵌套类 FactoryScreenBr
  • 如果我正在对将用作查询字符串参数的 URI 进行编码:encodeURI 或encodeURIComponent

    来自旧帖子 我应该使用encodeURI 还是encodeURIComponent 来编码URL 它说 encodeURI assumes that the input is a complete URI that might have s
  • nvd3 piechart.js - 如何编辑工具提示?

    我正在使用 nvd3 的 piechart js 组件在我的网站上生成饼图 提供的 js 文件包含几个 var 如下所示 var margin top 30 right 20 bottom 20 left 20 width null hei
  • 在大查询中从宽到长重塑(标准 SQL)

    不幸的是 在 BQ 中进行重塑并不像在 R 中那么容易 而且我无法导出该项目的数据 这里是输入 date country A B C D 20170928 CH 3000 3 121 13 3200 20170929 CH 2800 31
  • %ENV 不起作用,我无法使用共享库

    我无法使用 ENV在我的 Perl 脚本上使用 var 来使用 Oracle 库 BEGIN ORACLE HOME usr lib oracle 10 2 0 3 client64 LD LIBRARY PATH ORACLE HOME
  • 如何在 Angular 4 中将对象转换为数组?

    我想转换我的Object数组 这是我的对象 5 0 10 28 0 14 3 0 6 我想要像下面这样的数组 type 5 0 value 10 type 28 0 value 14 type 3 0 value 6 or 5 0 10 2
  • Android杀死进程[重复]

    这个问题在这里已经有答案了 如何通过一次单击杀死整个应用程序 finish 不起作用 它重定向到之前的活动 请指导我 public void onClick View arg0 TODO Auto generated method stub
  • 在 iframe 中创建可排序的 jQuery UI

    在页面上我有一个 iframe 在这个 iframe 中是我需要进行排序的项目的集合 所有 Javascript 都在父页面上运行 我可以访问 iframe 文档中的列表并使用上下文创建可排序 var ifrDoc iframe conte
  • 为什么 postgres 对相同的间隔值显示两种不同的格式?

    我正在帮忙做这件事question尝试更改间隔的格式 from 01 day 22 10 37 to 46 10 37 我给出了一个字符串操作的解决方案 但后来我发现 postgres 可以在两种不同的格式上显示相同的间隔 SELECT 2
  • 如何从 Javascript 启动两个或多个自定义 URL 协议

    我有一个旧的 html 页面 它创建一个脚本文件并使用以下命令执行它 fsoObject new ActiveXObject Scripting FileSystemObject wshObject new ActiveXObject WS
  • linux下C++中socket监听没有解除绑定

    我有一个监听某个端口的套接字 我将 SIGSTOP 信号发送到在端口上等待的线程 使用accept 并终止它 然后我关闭我等待的套接字的 fd 但对于我的项目的下一次运行 它不允许我再次监听该端口 我的程序是linux下的C 我应该怎么办
  • 使用 .prototype 和 __proto__ 创建子类

    我最近通过编写一些 gnome shell 扩展来学习 javascript 因此我对 Javascript 的理解是由我在 gnome shell javascript 源代码中观察到的示例塑造的 我有一种感觉 我对课程的理解是错误的 只
  • Gson TypeToken 是如何工作的?

    据我了解 在 Java 中 与 C 中的泛型相反 泛型是编译时功能 并通过类型擦除来删除 那么 Gson 的TypeToken真的有效吗 它如何获得对象的泛型类型 来自 JLS 4 6 强调我的 类型擦除是从类型 可能包括参数化类型和类型变