泛类的类

Dio*_*lor 9 java

我可能在这里瞎了一些人,但无论如何我都会开枪.

我知道我能做到:

Class<Response> c = Response.class;
Run Code Online (Sandbox Code Playgroud)

获取对象的类.假设Response对象是Response<T>我想要执行以下操作

Class<Class<User>> c =  Response<User>.class;
Run Code Online (Sandbox Code Playgroud)

我的完整问题:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是上面的参数尚未在赋值中指定.理论上,正确的方法需要:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这会生成"无法从参数化类型中选择"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 );
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 6

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

Class<GenericType<GenericArgument>>
Run Code Online (Sandbox Code Playgroud)

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

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

你似乎在使用杰克逊的ObjectMapper.它提供了一种黑客在类型令牌的形式获取泛型类型的信息.您可以使用TypeReferenceJavaType实例来表示泛型类型.互联网上的这里和其他地方的例子.

  • 嗯,是。上述“T”工作的唯一方法是在变量中传递一个常量类型,例如“@JsonDeserialize(as=User.class) private T response;”,这与“new TypeReference&lt;Response&lt;User&gt;&gt;”相同(){}`。死路。 (2认同)