当前位置: 首页 > 面试题库 >

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

慕容越泽
2023-03-14
问题内容

假设通用类型声明(Java)

class Foo<T> {
    public T bar;
}

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


问题答案:

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

但是,让我们看一下TypeTokenGson网站上的方法实际完成的工作。您创建一个对象的匿名子类的对象TypeToken,然后使用其getType()方法请求其类型参数。类的超类是其元数据的一部分,并且包括其超类的通用参数。因此,在运行时,它可以查看自己的继承层次结构,并弄清楚您使用的类型参数是什么TypeToken,然后返回java.lang.reflect.Type该类型的实例(如果已参数化,它将是一个ParameterizedType实例)。一旦获得此Type实例,就应该将其作为的第二个参数传递toGson()

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



 类似资料:
  • 问题内容: 我该如何实现? 到目前为止,我尝试过的所有操作始终返回类型,而不是所使用的特定类型。 问题答案: 正如其他人所提到的,只有在某些情况下才能通过反思来实现。 如果你确实需要类型,这是通常的(类型安全的)解决方法:

  • 问题内容: 我该如何实现? 到目前为止,我尝试过的所有操作始终返回类型,而不是所使用的特定类型。 问题答案: 正如其他人所提到的,只有在某些情况下才能通过反射来实现。 如果你确实需要类型,这是通常的(类型安全)解决方法:

  • 问题内容: 给定具有以下结构的类。我试图确定由泛型方法的调用者分配的参数T的类型。 在C#中,我将使用“ default(T)”或“ typeof(T)”,但我试图在Java中执行此操作。谁知道/如何做?我真的不需要实例,我只需要Class定义。 问题答案: 你不能那样做。您可以做的是使方法签名如下: 然后,您可以使用给定的类检查类型。

  • 如果我们提供足够的泛型信息,像Jackson这样的库可以从JSON创建对象。 在杰克逊,我们可以 在这种情况下,我们应该得到 在这种情况下,我们应该得到 在这种情况下,我们应该得到 为了进一步澄清,我希望在不创建任何其他类的情况下获取类型信息,并且这些信息应该传递给序列化程序,即我不希望更改类似于的序列化程序方法签名。我们可以创建任意多的helper类,也可以强制从某个超类扩展有效负载类(超类可以

  • 给定一个非空二叉树,求最大路径和。 对于这个问题,路径被定义为沿着父子连接从某个开始节点到树中任何节点的任何节点序列。路径必须包含至少一个节点,并且不需要经过根。 和 = 42 我是初学者。如果可能的话,只帮助cpp,我对逻辑非常清楚。我想知道我的数据类型知识有什么问题? 下面的maxpathsum函数必须返回int值,我使用long-long只是为了避免整数溢出,然后在返回最终答案之前进行类型转

  • 问题内容: 好的,因此,我正在设置自己的XML序列化(我知道那里还有其他东西,甚至Java中内置了一些东西,但是我自己学习来做,因为可以使用它非常棒)。我已经序列化了。我目前正在进行反序列化(读取XML文件并基于文件中的数据组装对象),并且在设置通用类型时遇到问题。经过广泛研究,我弄清楚了如何获取类的泛型类型,以便在序列化时可以编写它们,但是我不知道如何执行此操作: 我已经在C#中看到了一些答案,