在Java中运行时确定泛型类型参数

时间:2010-07-15 20:14:20

标签: java generics gson

class Json<T>
{
  @SerializedName( "T's type here" ) 
  private final ArrayList<T> _bucket = new ArrayList<T>( 5 );
  ...
}

我想知道如何(如果可能的话)可以在运行时确定类的泛型参数。从我读过的内容来看,泛型类的子类是可能的,但是我还没有找到如何用类型本身来做。这些链接有一些很好的信息,但我不确定这是我正在寻找的。

http://blog.xebia.com/2009/02/07/acessing-generic-types-at-runtime-in-java www.artima.com/weblogs/viewpost.jsp?thread=208860

我最终要完成的是让Gson序列化上面的'_bucket'变量,作为类型'T'的类名。

如果有人能指出我正确的方向,我会很感激。

2 个答案:

答案 0 :(得分:6)

在给定示例中,泛型类型在运行时不可用。只有在编译时指定通用类型信息才能通过反射获得 - 例如,如果您定义了子类SomeTypeJson extends Json<SomeType>

作为一个kludge,您可以通过检查List的内容来猜测泛型类型,通过反射找到最具体的常见超类。

答案 1 :(得分:0)

通常,您会将此类型子类化为具体类型,然后处理包应该能够正确解析类型。 或者,许多包具有某种类型的引用概念(“类型令牌”),它只使用匿名类来提供类型信息,以便反序列化器可以正确地推断出预期的类型;我不记得Gson使用的是什么类,它应该有这样的东西。

如果您拥有的唯一的东西是运行时实例,那么您运气不好,除非有非空List并检查其类型(如建议的那样)。