类型引用>() { }

2023-11-21

从几天前开始,我开始从事一个网络服务项目。该项目正在使用Jackson编组和解组JSON 对象。所以我的问题是:

为什么我总是必须把{}当我创建一个实例时TypeReference?我知道构造函数是protected,但为什么是protected?我认为这就像一个黑客,让构造函数可见,创建构造函数的实现,因为TypeReference is abstract你可以做到。但这有什么意义呢?

String jsonString = "{\" firstName\":\"John\",\"lastName\":\"Chen\"}";
ObjectMapper objectMapper = new ObjectMapper();

// properties will store name and value pairs read from jsonString
Map<String, String> properties = objectMapper.readvalue(
    jsonString, new TypeReference<Map<String, String>>()
        { //
        });

TL;DR

通过子类化,可以TypeReference来提取actual泛型类型参数。例如:

TypeReference<String> ref = new TypeReference<String>(){};
System.out.println(ref.getType());

Prints:

class java.lang.String

当您无法使用普通类时,这会很有用。例如,当这不起作用时:

// doesn't work
Type type = ArrayList<String>.class; 

您仍然可以通过使用TypeReference:

// will yield Class<ArrayList<String>>>
Type type = new TypeReference<ArrayList<String>>(){}.getType();

Detailed

当看着的源代码TypeReference(使用杰克逊2.8.5)你可以看到构造函数主体包含以下几行:

Type superClass = getClass().getGenericSuperclass();
if (superClass instanceof Class<?>) { // sanity check, should never happen
    throw new IllegalArgumentException("Internal error: TypeReference constructed without actual type information");
}
_type = ((ParameterizedType) superClass).getActualTypeArguments()[0];

有趣的是第一行和最后一行。让我们仔细看看第一行:

Type superClass = getClass().getGenericSuperclass();

例如,当您使用匿名类创建子类时:

TypeReference<SomeStype> ref = new TypeReference<SomeType>(){};

Then getClass返回当前的Class对象(匿名类),以及getGenericSuperclass()将返回Class对象从class在我们的例子中,当前的实现延伸自superClass将等于Class<TypeReference<?>>.

现在查看构造函数主体的最后一行:

_type = ((ParameterizedType) superClass).getActualTypeArguments()[0];

据我们所知,superClass is the Class对象为TypeReference<?>我们知道它有一个通用参数。因此演员阵容ParameterizedType。这指定了Type有方法getActualyTypeArguments()它返回该类指定的所有通用参数的数组。在我们的例子中它只是 1。所以[0]将产生第一个元素。在示例中我们将获取实际指定的类型参数SomeType.

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

类型引用>() { } 的相关文章

随机推荐

  • 使用.NET捕获屏幕截图[重复]

    这个问题在这里已经有答案了 可能的重复 如何以位图形式捕获屏幕 我需要制作一个应用程序 每当按下特定按钮时都会捕获当前屏幕的快照 我搜索了很多 但只找到了如何捕获当前窗口 您能帮我弄清楚如何在 NET 中执行此操作吗 我们可以通过点击打印屏
  • mysql RAND() 限制

    您好 我有一个这样的查询 SELECT otel id FROM YAZILIM menu icerik WHERE YAZILIM menu icerik menu id 39 AND otel id IN SELECT otel id
  • 比较 Javascript 中的日期和时区

    当使用 gt 和 当您将其转换为 JavaScript 时 将按照您的预期考虑时间戳字符串表示形式的时区部分Date对象 内部值是一个简单的标量 标准化为UTC 所以比较时不需要特殊的时区处理Date对象 var d1 new Date D
  • Javascript 日期,这是我的错误还是我发现了错误?

    我的应用程序中有一个简单的 Javascript 部分 其中有一个链接 添加日期 它会在日期上添加 1 天 它总是工作得很好 除非日期是 11 07 2010 然后链接突然不再工作 它真的很奇怪 因为它只在特定日期 11 07 2010 挂
  • GCC 编译时抛出错误:错误:未知类型名称“FILE”

    我正在制作一个只写的函数 hello 到一个文件 我已将其放在另一个文件中 并将其标头包含在程序中 但 gcc 给出了一个错误 error unknown type name FILE 代码如下 app c include
  • 缩放 SKNode 不一致

    我已经创建了自己的解决方案 用于放大或缩小特定的 SKNode 而无需缩放整个场景 它似乎主要按照我期望的方式工作 有 2 个值得注意的例外 我希望在这里得到输入 首先是代码 该控制语句位于touchesMoved方法内 if touche
  • 使用jquery更改给定特定宽度范围的类名(媒体查询)

    我正在尝试修改以下 html div class col1 width8 img src images entity jpg div 我想使用媒体查询 但我不想修改css 而是将类名从width8替换为width6 对于下面的标准媒体查询来
  • iPhone 3GS 上后台线程消耗 100% CPU 导致潜在主线程

    在我的应用程序中 我在 NSOperationQueue 中执行 10 个异步 NSURLConnections 作为 NSInitationOperations 为了防止每个操作在连接有机会完成之前返回 我调用 CFRunLoopRun
  • 编辑表单中的 Django-Taggit

    这是一个模型类 class ModelName models Model pasta TaggableManager verbose name u Pasta 和一个表单模板 正常 P form as p 我想让一切都非常干净和有用 但结果
  • 使用“::”代替“module ...”作为 Ruby 命名空间

    在 Ruby 中 写法有区别吗class Foo Bar and module Foo class Bar用于命名空间 如果是这样 那又怎样 如果你使用class Foo Bar 但是Foo模块尚未定义 将会引发异常 而module Foo
  • Solr 通配符搜索

    如果我有一条包含关键字 Chris Muench 的记录 我希望能够匹配 Mue 或 Chr 我怎样才能用 solr 查询来做到这一点 目前我执行以下操作 results solr gt search Apache Solr Service
  • 使用 matplotlib 的内存泄漏

    这并不是一个错误报告 即使这些泄漏可能是由于 mpl 错误造成的 请解释所提出的问题 以寻求解决方法 问题很简单 绘制大量数据 使用plot 或scatter 清除 释放所有内容 垃圾收集 但仍然没有释放几乎所有内存 Line Mem us
  • 如何使用 Moment.js 排除两个日期之间的周末

    我试图在我的 JavaScript 代码中排除周末 我使用 moment js 并且很难为 天 选择正确的变量 到目前为止 我认为我需要通过将工作日变量更改为仅从第 1 天计数到第 5 天来排除第 6 天 星期六 和第 0 天 星期日 但不
  • 无需重新加载页面即可收到通知(例如 facebook 或 google plus 通知)

    将 Facebook 等通知发送到仪表板的理想机制是什么 我认为最好的方法是每 5 秒对 php 页面进行一次 Ajax 调用并检索通知 有没有更好的方法来进行类似的更改 它也应该适用于所有移动浏览器 我按照以下方式做 use post在j
  • 为什么 Graphics.MeasureString() 返回的数字高于预期数字?

    我正在生成收据 并使用 Graphics 对象调用 DrawString 方法来打印所需的文本 graphics DrawString string font brush widthOfPage 2F yPoint stringformat
  • Helm 3:连接到本地 Kubernetes 时出现 x509 错误

    我是一个完美的noob与 K8 一起 我安装了microk8s and Helm using snap在本地进行实验 我想知道我当前的问题是否来自于使用snap 据我了解 其目的是封装 环境 Ubuntu 20 04LTS helm ver
  • 将 ISO 8601 时间格式转换为正常持续时间

    我有一个持续时间字符串 PT1M33S 我想得到以下格式的结果 gt 01 33 谁能告诉我如何使用js或jquery做到这一点 这似乎不是时间格式 只是视频的持续时间 33 Seconds PT1M33S 1 Minute H 小时M 分
  • 如何从字符串中删除换行符?

    我有一个以下格式的字符串 string s This is a Test String n This is a next line t This is a tab n 我想删除所有出现的 n and r从上面的字符串 我努力了string
  • stl::multimap - 如何获取数据组?

    Multimap 本质上具有按键排序的数据组 我想要一种方法来访问这些单独的组并获取它们的聚合值 例如 在一个std multimap lt string int gt 我存储 Group1 1 Group1 2 Group1 3 Grou
  • 类型引用>() { }

    从几天前开始 我开始从事一个网络服务项目 该项目正在使用Jackson编组和解组JSON 对象 所以我的问题是 为什么我总是必须把 当我创建一个实例时TypeReference 我知道构造函数是protected 但为什么是protecte