将泛型 Class<T> 作为参数传递

6

我需要将一个类作为参数传递,但是我只有泛型类型 T。如何推断出泛型 Class 并将其传递给 fromJson()

public class Deserializer<T> implements JsonDeserializer<JsonList<T>> {
    public T someMethod(){
        ...
        T tag = gson.fromJson(obj, ???); // takes a class e.g. something.class
        ...
    }                       
}

谢谢

3个回答

6

3

您不能在运行时生成它。这就是为什么Gson#fromJson()要求您传递它的原因。


2
假设您的类名为 Deserializer,通常的做法是将 Class 作为构造函数参数传入:
public class Deserializer<T> implements JsonDeserializer<JsonList<T>> {

  public static <T> Deserializer<T> newInstance(Class<T> c) {
    return new Deserializer<T>(c);
  }

  private final Class<T> clazz;
  private Deserializer(Class<T> c) { this.clazz = c; }

  public T someMethod(){
    ...
    T tag = gson.fromJson(obj, clazz); // takes a class e.g. something.class
    ...
  }                       
}

然后在客户端代码中:

Deserializer<String> d = Deserializer.newInstance(String.class);

2
为了避免客户端代码中参数类型的重复,我们热情建议使用工厂方法:public static <T> Deserializer<T> newInstance(Class<T> c) - Marko Topolnik
1
@MarkoTopolnik 如果你不喜欢枯燥乏味的重复,最好避免使用泛型和Java :) - Alex
很高兴,每当有这个选项时——但这种情况并不经常发生 :) - Marko Topolnik
你不需要静态工厂方法,只需使用Java 7并编写以下代码: Deserializer<String> d = new Deserializer<>(String.class) - herman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接