1. 泛型通常用于集合,如Set和Map等。这样的用法也就限制了每个容器只能有固定数目的类型参数,一般来说,这也确实是我们想要的。

然而有的时候我们需要更多的灵活性,如数据库可以用任意多的Column,如果能以类型安全的方式访问所有Columns就好了,幸运的是

有一种方法可以很容易的做到这一点,就是将key进行参数化,见以下代码

 1 public class Favorites {2     private Map<Class<?>, Object> favorites = new HashMap<Class<?>, Object>();3     public <T> void setFavorite(Class<T> klass, T thing) {4         favorites.put(klass, thing);5     }6     public <T> T getFavorite(Class<T> klass) {7         return klass.cast(favorites.get(klass));8     }9     public static void main(String[] args) {
10         Favorites f = new Favorites();
11         f.setFavorite(String.class, "Java");
12         f.setFavorite(Integer.class, 0xcafebabe);
13         String s = f.getFavorite(String.class);
14         int i = f.getFavorite(Integer.class);
15     }
16 }

2.不足之处

There is a limitation to this pattern.

//You can't add your favorite List<String> to a Favorites because you simply can't make a type token for a generic type.

f.setFavorite(List<String>.class, Collections.emptyList());

3.改进

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;/*** References a generic type.** @author crazybob@google.com (Bob Lee)*/
public abstract class TypeReference<T> {private final Type type;private volatile Constructor<?> constructor;protected TypeReference() {Type superclass = getClass().getGenericSuperclass();if (superclass instanceof Class) {throw new RuntimeException("Missing type parameter.");}this.type = ((ParameterizedType) superclass).getActualTypeArguments()[0];}/*** Instantiates a new instance of {@code T} using the default, no-arg* constructor.*/@SuppressWarnings("unchecked")public T newInstance()throws NoSuchMethodException, IllegalAccessException,InvocationTargetException, InstantiationException {if (constructor == null) {Class<?> rawType = type instanceof Class<?>? (Class<?>) type: (Class<?>) ((ParameterizedType) type).getRawType();constructor = rawType.getConstructor();}return (T) constructor.newInstance();}/*** Gets the referenced type.*/public Type getType() {return this.type;}public static void main(String[] args) throws Exception {List<String> l1 = new TypeReference<ArrayList<String>>() {}.newInstance();List l2 = new TypeReference<ArrayList>() {}.newInstance();}
}

参考:

  • com.google.common.reflect.TypeToken<T>
  • com.fasterxml.jackson.core.type.TypeReference

原文:Super Type Tokens

JSON 序列化与反序列化:使用TypeReference 构建类型安全的异构容器相关推荐

  1. json 反序列化 父子类型_Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo...

    Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...

  2. 一文读懂Json序列化与反序列化

    一文读懂Json序列化与反序列化 一文读懂Json序列化与反序列化 #mermaid-svg-tVjnnlFu6ZBDpGOQ {font-family:"trebuchet ms" ...

  3. 当Java泛型擦除遇到JSON序列化和反序列化

    当Java泛型类型擦除遇到JSON序列化和反序列化 目录 当Java泛型类型擦除遇到JSON序列化和反序列化 前言 测试 前言 -最近看到了Spring 关于 RestTemplate的源码实现又有了 ...

  4. DotNet的JSON序列化与反序列化

    JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...

  5. JSON序列化和反序列化还有这种玩法

    Mixin对于前端开发者可不陌生,Vue.React等知名前端框架都使用了Mixin.而对于后端开发,尤其是Java后端开发来说Mixin却是一个很陌生的概念.今天来我们通过Jackson让后端开发者 ...

  6. C#中JSON序列化和反序列化

    有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境-- 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...

  7. Go进阶(7): JSON 序列化和反序列化

    1. json序列化和反序列化基础 json数据的序列化和反序列化是一种非常常见的方式,尤其是在http/rcp的微服务调试中. 基础语法 在 Go 中我们主要使用官方的 encoding/json  ...

  8. 序列化对象C++对象的JSON序列化与反序列化探索

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 一:背景 作为一名C++开发人员,我始终很期待能够像C#与JAVA那样,可以省力的进行对象的序列化与反序列化,但到现在为止,还没有找 ...

  9. php和js序列化,PHP中serialize和json序列化与反序列化的区别

    在PHP中,serialize和json两种方式对一个对象或数组进行序列化或反序列化有什么区别呢? 假设一个对象和一个数组: PHP 1 2 3 4$web=newstdClass; $web-> ...

最新文章

  1. PackageManagerService详解
  2. RN pod install 失败(could not find compatible versions for pod “React/Core“)
  3. MarkdownPad2基础语法
  4. 各类神经网络知识收集
  5. 【idea中debug的使用】
  6. Queue(队列)-Swift实现与广度优先搜索应用
  7. 移动场景在其缩略图中显示场景中所显示的区域
  8. Atitit. 软件---多媒体区---- jmf 2.1.1 Java Media Framework 支持的格式
  9. JVM致命错误日志详解
  10. 1. 类,对象,对象属性,对象的行为
  11. 印度人为什么立刀切菜_印度人如何用菜刀,为什么是菜刀不动食材动,与中国完全相反...
  12. The server time zone value ‘?й???????‘ is unrecognized or represents more than one time zone.
  13. linux can远程帧,【值得收藏】详解Linux的CAN接口编程技巧
  14. 视频号拍摄技巧和制作方法有哪些?
  15. 北航计算机学院吉祥物,北航软件学院吉祥物征集令
  16. CAD设置命令框的字体
  17. 华为OD面试——机试算法
  18. Metasploit技术(四)——进程迁移
  19. 北京大学计算机专业王腾,王腾-理论与应用地球物理研究所-北大地空学院
  20. Go 应用的持续性分析

热门文章

  1. Eclipse安装AmaterasUML
  2. 史上最全的Linux常用——目录和文件管理命令——收藏这一篇就够了!(超全,超详细)
  3. Linux内核判断大小端,linux kernel 如何处理大小端
  4. python程序运行时间计算公式_Python执行时间的计算方法小结
  5. 手动修改Win7开机欢迎界面背景图片
  6. System.out.println与System.err.println的区别
  7. js大屏导出图片_整理了30个实用可视化大屏模板,附源文件+工具
  8. 使用计算机的优点缺点,计算机使用二进制的优缺点
  9. java throwable用法_java – ExceptionHandler不能与Throwable一起使用
  10. 如何成为数据型产品经理