泛类的类

时间:2014-09-26 19:22:31

标签: java

我可能会对这里的一些人视而不见但是无论如何我都会开枪。

我知道我能做到:

Class<Response> c = Response.class;

获取对象的类。假设Response对象是Response<T>我想做类似下面的事情

Class<Class<User>> c =  Response<User>.class;

我的完整问题:

public class RequestHelper<T> extends AsyncTask<String, Response, T> {

    @Override
    protected T doInBackground(String... strings) {
       ...
       Response <T> r = objectMapper.readValue( result, Response.class );
       return r .getResponse();
    }
}

//and

public class Response <R> {
    private R response;
    public R getResponse() {
        return response;
    }
}

但是在分配中未指定参数。理论上,正确的方法需要:

public class RequestHelper<T> extends AsyncTask<String, Response, T> {

    @Override
    protected T doInBackground(String... strings) {
       ...
       Response <T> r = objectMapper.readValue( result, Response <T>.class );
       return r.getResponse();
    }
}

但是这会产生“无法从参数化类型中选择”lint错误。

或者我可以在构造函数中传递类:

public class RequestHelper<T> extends AsyncTask<String, Response, T> {

    ....
    public RequestHelper(Class<Class<T>> tClass){
         this.tClass = tclass;
    }

    @Override
    protected T doInBackground(String... strings) {
       ...
       Response <T> r = objectMapper.readValue( result, tclass );
       return r.getResponse();
    }
}

// where the init of the class would have been:

 new RequestHelper<User>( Response<User>.class );

1 个答案:

答案 0 :(得分:6)

正如评论所示,没有

这样的东西
Class<GenericType<GenericArgument>>

或者更确切地说,它并没有像你想象的那样做。每个类型声明(类,接口,枚举,原语)都会获得一个Class实例,无论它是否是通用的。

因此,即使您具有类型Class<GenericType<ArgumentOne>>的引用和类型Class<GenericType<ArgumentTwo>>的另一个引用,它们引用的实例也将完全相同。更重要的是,绝对没有办法查询类型参数类型。

你似乎在使用杰克逊的ObjectMapper。它提供了一种 hack ,用于以类型标记的形式获取泛型类型信息。您可以使用TypeReferenceJavaType实例来表示泛型类型。示例here和互联网上的其他地方。