gpt4 book ai didi

java - 如何在运行时根据泛型类型定义和运行时类型参数构建 Java 类型对象?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:52:18 24 4
gpt4 key购买 nike

假设一个泛型类型声明(Java)

class Foo<T> {
public T bar;
}

我如何在运行时实例化一个 Type 对象,该对象表示 Foo 在特定类型 T 上参数化(也仅在运行时才知道)?

最佳答案

我想我明白你的问题了。你想序列化一个 Foo<T> , 你有 T 的类对象在运行时(但在编译时不固定)。因此,建议在 Gson 中创建 TypeToken 的匿名子类的解决方案。不起作用,因为这需要在编译时对参数化类型(例如 Foo<String> )进行硬编码,如果您使用类似 Foo<T> 的东西,它就不起作用.

不过,让我们看看TypeToken是什么Gson 站点上的方法实际上可以完成。您创建了一个匿名子类的对象 TypeToken ,然后使用其 getType() 询问其类型参数方法。类的父类(super class)是其元数据的一部分,并包括其父类(super class)的通用参数。所以在运行时,它可以查看自己的继承层次结构,并找出你为 TypeToken 使用的类型参数, 然后返回 java.lang.reflect.Type该类型的实例(如果它被参数化,将是一个 ParameterizedType 实例)。一旦你得到这个Type例如,您应该将其作为 toGson() 的第二个参数传递.

我们需要做的就是找到另一种方法来创建 ParameterizedType 的这个实例. ParameterizedType是一个接口(interface),但不幸的是,公共(public) Java API 不提供任何具体实现或任何创建 ParameterizedType 的方法。动态地。似乎有一个类叫做 ParameterizedTypeImpl ,在您可以使用的私有(private) Sun API 和 Gson 代码中 (e.g. here)。您可以简单地复制代码并将其重命名为您自己的类。然后,创建一个Type表示 Foo<String> 的对象在运行时,你可以做类似 new ParameterizedTypeImpl(Foo.class, new Type[]{String.class}, null) 的事情(未经测试)

关于java - 如何在运行时根据泛型类型定义和运行时类型参数构建 Java 类型对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9111899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com