19

我有以下课程:

public abstract class MyClass<T extends Object> {

    protected T createNewFromData(Reader reader){
        GSON.fromJSON(reader,T.class); // T.class isn't allowed :(
    }
}

如何将 Class<T> 实例传递到那里?是否有一些奇怪而古怪的工作?

除了从 T 类型的预实例化对象之外,还有其他方法可以获取 Class<T> 引用吗?它也不会让我这样做:

T t = new T();
Class<T> klass = t.class;

尝试#2

有趣的是,如果我从类定义中删除“扩展 JSONOBjBase”,我只会得到一个未经检查的强制转换警告(没有错误)。有没有另一种方法来写演员是如何完成的?

日食截图

4

4 回答 4

12

否。
由于类型擦除,此信息在运行时不存在。

相反,您可以重新使用 GSON 的TypeToken hack,它创建一个继承封闭通用基类的匿名类。

于 2012-09-21T03:09:14.653 回答
8

或者您可以将Class作为构造函数参数发送并使用该对象而不是尝试获取 T.class。

public abstract class MyClass<T extends Object> {

    private Class<T> klass;

    public MyClass(Class<T> klass) {
        this.klass = klass;
    }

    protected T createNewFromData(Reader reader){
        GSON.fromJSON(reader,klass); 
    }
}
于 2012-09-21T03:36:48.577 回答
0

好的。你应该这样做:

      public abstract class MyClass <T> {

        public T createNewFormData(Reader reader, Class<T> clazz){
        return GSON.fromJSON(reader, clazz);
        }
      }

      public class ImplementMyClass extends MyClass<Long>{
      }

并这样称呼它:

            MyClass<Long> cls = new ImplementMyClass();


    Socket s = null;
    try {
        s = new  Socket("localhost", 8080);
    } catch (Exception e) {
        e.printStackTrace();
        return;
    }
    InputStream i = null;
    try {
        i = s.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }
    InputStreamReader reader = new InputStreamReader(i);
    cls.createNewFormData(reader, Long.class);
于 2012-09-28T04:42:19.967 回答
0

这种与上面Alex给出的答案相呼应。这是一个示例代码,我正在使用 jackson 库编写通用 json -> POJO 包装器:

/* Method that reads json string from a file, and maps it to an instance of the class passed in as the second argument. */


public static <T> T getObjectMappedFromJsonInFile(String fileName, Class<T> clazz){

    ObjectMapper mapper=new ObjectMapper();

    File file=new File(fileName);

    try{

        JsonNode jsonNode=mapper.readTree(file);

        T response=mapper.convertValue(jsonNode,clazz);

        return response;
    }catch (Exception e){

        log.error("Error reading transactions.json file",e);

    }
    return null;

}

这就是我所说的:

TransactionsResponse response=getObjectMappedFromJsonInFile(fileName,TransactionsResponse.class);
于 2016-03-10T01:40:25.817 回答