gpt4 book ai didi

java - 通用类的类

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:21:33 26 4
gpt4 key购买 nike

我可能会在这里蒙蔽一些人,但无论如何我都会开火。

我知道我能做到:

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 );

最佳答案

正如评论所暗示的那样,没有这样的东西

Class<GenericType<GenericArgument>>

或者更确切地说,它并不像您想象的那样。每个类型声明(类、接口(interface)、枚举、原语)都有一个 Class实例,是否通用。

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

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

关于java - 通用类的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26066867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com