通用类

Diolor:

我可能会在这里蒙蔽一些人,但我还是会开除。

我知道我可以做:

Class<Response> c = Response.class;

获取对象的类。假设响应对象是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();
    }
}

但这会生成“无法从参数化类型中选择”的棉绒错误。

另外,我可以在构造函数中传递该类:

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 );
Sotirios Delimanolis:

正如评论所暗示的,没有这样的事情

Class<GenericType<GenericArgument>>

或更确切地说,它没有实现您可能认为的功能。每个类型声明(类,接口,枚举,基元)都获得一个Class实例,无论它是否为泛型。

这样,即使您有一个type的引用Class<GenericType<ArgumentOne>>和另一个type Class<GenericType<ArgumentTwo>>的引用,它们引用的实例也将完全相同。而且,绝对没有办法查询类型实参类型。

您似乎正在使用Jackson的ObjectMapper它提供了一种以类型标记形式获取通用类型信息技巧您可以使用TypeReferenceJavaType实例来表示通用类型。此处以及Internet上其他地方的示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章