Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型类的类_Java - Fatal编程技术网

Java 泛型类的类

Java 泛型类的类,java,Java,我可能会弄瞎这里的一些人,但无论如何我会开枪的 我知道我能做到: Class<Response> c = Response.class; Class c=Response.Class; 获取对象的类。假设Response对象是Response,我想执行如下操作 Class<Class<User>> c = Response<User>.class; Class c=Response.Class; 我的全部问题是: public clas

我可能会弄瞎这里的一些人,但无论如何我会开枪的

我知道我能做到:

Class<Response> c = Response.class;
Class c=Response.Class;
获取对象的类。假设Response对象是
Response
,我想执行如下操作

Class<Class<User>> c =  Response<User>.class;
Class c=Response.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;
    }
}
公共类RequestHelper扩展异步任务{
@凌驾
受保护的T-doInBackground(字符串…字符串){
...
Response r=objectMapper.readValue(result,Response.class);
返回r.getResponse();
}
}
//及
公众课堂反应{
私人R反应;
公共getr响应(){
返回响应;
}
}
但上述参数尚未在赋值中指定。理论上,正确的方法需要:

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();
    }
}
公共类RequestHelper扩展异步任务{
@凌驾
受保护的T-doInBackground(字符串…字符串){
...
Response r=objectMapper.readValue(result,Response.class);
返回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 );
公共类RequestHelper扩展异步任务{
....
公共RequestHelper(类tClass){
this.tClass=tClass;
}
@凌驾
受保护的T-doInBackground(字符串…字符串){
...
响应r=objectMapper.readValue(结果,tclass);
返回r.getResponse();
}
}
//其中,类的init应该是:
新RequestHelper(Response.class);

正如评论所暗示的,没有

Class<GenericType<GenericArgument>>
或者更确切地说,它没有做你可能认为它做的事情。每个类型声明(类、接口、枚举、基元)都会获得一个
class
实例,无论它是否为泛型


因此,即使您有一个
Class类型的引用,也无法在运行时获取有关泛型类型参数的信息,因为编译后它不存在。显式传入类是一种常见的解决方法。Jackson为此提供了类型标记。我认为不能在类中捕获泛型参数,但可以在子类中捕获泛型参数。我想这可能就是@SotiriosDelimanolis所指的。谢谢Sotiri。特别是在上面的例子中,我使用了
newtypereference(){}
作为类参数来设置和提供类型。@door或者小心地使用
T
作为类型参数,您没有提供任何具体的类型。Jackson仍将使用默认设置。这种方法只适用于具体类型,而不适用于类型变量。上述
T
工作的唯一方法是在变量中传递一个常量类型,例如
@JsonDeserialize(as=User.class)private T response
newtypereference(){}
相同。死胡同,先生,你能解释一下我面临的同样问题吗