TypeToken 与T泛型

本文介绍了一种将JSON字符串转换为指定泛型对象的方法,通过使用Gson库结合TypeToken来实现。此方法能够确保参数和返回值的类型正确性。

暂时找不到很好的方案,虽然看起来难看了一点,但是确保了参数和返回值的类型。

public static <T> T convert2Obj(String json,TypeToken<T> typeToken){
    T result = null;        
    try
    {
        Type type = typeToken.getType();
        Gson gson = new Gson();
        result = gson.fromJson(json, type);
    } catch (JsonSyntaxException e)
    {}
    return result;

}
### Java 中使用 `TypeToken` 表示 `List<T>` 的实现方式 在 Java 中,`TypeToken` 是一个常用的工具类,用于捕获信息。由于 Java在运行时会被擦除(Type Erasure),因此直接使用 `List<String>` 无法保留具体的类信息。为了在需要类信息的场景(如反序列化)中正确处理,可以使用 `TypeToken` 来捕获和传递类信息[^1]。 以下是一个完整的实现示例,展示如何在 Java 中使用 `TypeToken` 表示 `List<T>` 并 C# 的 `List<string>` 对应: #### 使用 `TypeToken` 捕获 ```java import com.google.gson.reflect.TypeToken; public class TypeTokenExample { public static void main(String[] args) { // 创建一个表示 List<String> 的 TypeToken 实例 Type listStringType = new TypeToken<List<String>>() {}.getType(); // 打印捕获的类信息 System.out.println("Captured type: " + listStringType); } } ``` 上述代码通过匿名内部类的方式创建了一个 `TypeToken<List<String>>` 实例,并调用其 `getType()` 方法获取运行时的类信息。这种方式可以确保即使在被擦除的情况下,仍然能够保留具体的类信息[^1]。 #### 的注册使用 如果需要将捕获的类信息注册到某个工厂或框架中,可以参考以下代码: ```java import com.google.gson.reflect.TypeToken; public class FactoryExample { public static void registerType() { // 创建一个表示 List<String> 的 TypeToken 实例 Type listStringType = new TypeToken<List<String>>() {}.getType(); // 假设有一个工厂类,用于注册类及其对应的构造器 Factory factory = new Factory(); factory.register(listStringType, () -> new ArrayList<String>()); // 验证注册的类是否正确 System.out.println("Registered type: " + listStringType); } } // 模拟工厂类 class Factory { public <T> void register(Type type, Supplier<T> supplier) { System.out.println("Type registered: " + type); } } ``` 此代码片段展示了如何将捕获的信息注册到一个工厂类中,类似于 C# 中的依赖注入或类映射功能[^1]。 #### 的反序列化 在 JSON 反序列化的场景中,`TypeToken` 的用途尤为明显。以下是一个使用 Gson 库进行反序列化的示例: ```java import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.List; public class DeserializationExample { public static void main(String[] args) { String json = "[\"item1\", \"item2\", \"item3\"]"; // 定义 List<String> 的类 Type listStringType = new TypeToken<List<String>>() {}.getType(); // 使用 Gson 进行反序列化 Gson gson = new Gson(); List<String> stringList = gson.fromJson(json, listStringType); // 打印反序列化后的结果 System.out.println("Deserialized list: " + stringList); } } ``` 在此示例中,`TypeToken<List<String>>` 被用来定义 `List<String>` 的具体类,并将其传递给 Gson 的 `fromJson` 方法以完成反序列化操作[^1]。 ### C# Java 的对应关系 在 C# 中,`List<string>` 是一个强类的集合,可以直接存储字符串元素。而在 Java 中,由于的擦除机制,`List<String>` 在运行时会被视为普通的 `List`。为了在需要类信息的场景中正确处理Java 提供了 `TypeToken` 工具类来捕获和传递类信息。这种机制使得 Java可以在运行时保持一定程度的类安全性和灵活性[^1]。 ### 注意事项 - `TypeToken` 是 Google Gson 库提供的工具类,因此需要引入 Gson 库才能使用。 - 如果不使用第三方库,也可以通过自定义方法捕获信息,但实现会更加复杂。 -Java 中,的擦除机制可能导致某些场景下无法直接获取类信息,因此需要借助 `TypeToken` 等工具类来解决这一问题。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值