为什么型类型信息可以通过匿名内部类来保存

背景

Java的泛型是在编译阶段实现的,这意味着泛型类型信息在编译后的字节码中通常是不可用的,因为它们会被擦除(Type Erasure)。例如,List<String>List<Integer>在运行时都被视为简单的List

泛型类型的保留

然而,当你创建一个匿名内部类,并且这个匿名内部类继承自一个具体的泛型类型时,Java编译器会将这个具体的泛型类型作为匿名内部类的一部分类型信息保留下来。这是因为匿名内部类是一个特殊的类,它没有名称,但它扩展了一个父类或实现了一个接口,并且这个信息(包括泛型类型参数)是必须的,以便于编译器能够正确地生成字节码。

示例解释

假设我们有一个泛型接口Interface<T>:

java 复制代码
public interface Interface<T> {
    T performAction();
}

当我们创建一个匿名内部类并为其指定一个具体的泛型类型String时,如下:

java 复制代码
Interface<String> myInterface = new Interface<String>() {
    @Override
    public String performAction() {
        return "Action Performed";
    }
};

在上面的代码中,我们创建了一个实现了Interface<String>的匿名内部类。这里的关键点是,尽管泛型类型参数String通常会在运行时被擦除,但由于这是一个匿名内部类的创建,Java编译器实际上会将String类型参数作为这个匿名内部类的一部分保留下来。

如何获取这个类型信息

TypeToken类的作用就是利用这个特性来捕获这个保留下来的类型信息。当我们使用TypeToken时,我们实际上是在创建一个匿名子类,并让它继承自带有泛型类型参数的TypeToken类。这样,我们就可以通过反射来获取这个类型信息:

java 复制代码
TypeToken<Interface<String>> typeToken = new TypeToken<Interface<String>>() {};
Type type = typeToken.getType(); // 这个type可以用来获取完整的泛型类型信息

在上面的代码中,new TypeToken<Interface<String>>() {}创建了一个匿名子类,它继承自TypeToken并且指定了泛型参数为Interface<String>。通过调用getType()方法,我们可以获得这个泛型接口的完整类型信息,包括它的泛型类型参数String

这个Type对象可以用于反序列化操作,比如在Gson中,我们可以使用这个Type对象来告诉Gson如何正确地将JSON数据转换为特定的泛型类型的Java对象。

希望这个解释和示例能够帮助你更好地理解TypeToken的工作原理。

相关推荐
YatHinLay24 分钟前
Spring Boot + Calcite 实现跨库查询
java
酷炫码神1 小时前
MosMos 创意效果与能力边界展示
java
Wang's Blog1 小时前
Java 接入Redis: 使用Jedis操作Redis
java·服务器·redis
事圆则缓1 小时前
Java 8 Lambda、Stream、Optional 与 Android 边界:从回调语法到运行时兼容
android·java
shehuiyuelaiyuehao1 小时前
算法50,分治归并,数组中的逆序对
java·算法
烽学长1 小时前
(附源码)基于Springboot+vue的图书阅读分享系统的设计与实现
java·spring boot·后端
Ivanqhz1 小时前
数据搬运是性能关键
java·服务器·网络·人工智能·深度学习
青山木1 小时前
RocketMQ 入门到原理(三):消息存储原理
java·后端·中间件·架构·rocketmq
MayBaymax1 小时前
Spring AI Alibaba Graph 实战:客服工单智能处理
java·ai·ai编程
光依旧2 小时前
MCP实战手记系列(五):让工具返回一个能点的界面(文末附github源码链接)
java·spring ai·前端集成·mcp·mcp apps