Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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_Generics_Retrofit2_Generic Programming_Robospice - Fatal编程技术网

Java 获取泛型的类型

Java 获取泛型的类型,java,generics,retrofit2,generic-programming,robospice,Java,Generics,Retrofit2,Generic Programming,Robospice,我需要得到泛型类型的类型。 我已经试过了 public abstract class RetrofitRequest<RESULT> extends SpiceRequest<Response<RESULT>> { public RetrofitRequest(){ super(Response<RESULT>.class); //compile time error } @Override pu

我需要得到泛型类型的类型。 我已经试过了

public abstract class RetrofitRequest<RESULT> extends SpiceRequest<Response<RESULT>> {

    public RetrofitRequest(){
        super(Response<RESULT>.class); //compile time error
    }

    @Override
    public final Response<RESULT> loadDataFromNetwork() throws Exception {
        WebService webService = RestFulWebService.getRestFulWebService();
        return doInBackground(webService);
    }

    protected abstract Response<RESULT> doInBackground(WebService webService) throws Exception;

}
谢谢


-supunz

在请求
类时,您需要镜像您的父控制器

public请求(类clazz){
超级(clazz);
}
令人遗憾的是,现在您必须将其一直带到继承链中,但是如果您想实例化它,您还需要提供类:

RetrofitRequest<String> impl = new RetrofitRequestImpl<String>(String.class);
RefughtRequestImpl=新的RefughtRequestImpl(String.class);

在评论的帮助下解决了我自己的问题

公共抽象类请求扩展了该请求{
受保护的请求(){
超级((类)(类)响应。类);
}
@凌驾
公共最终响应loadDataFromNetwork()引发异常{
WebService WebService=RestFulWebService.getRestFulWebService();
返回doInBackground(webService);
}
@工作线程
受保护的抽象响应doInBackground(WebService WebService)引发异常;
}

刚刚保存了我的一天

类型擦除。你不会轻易得到的。为什么这对你没用?你到底想解决什么?因为它在
super(Response.class)中生成编译时错误
实例作为运行时类型标记(“RTTT”)时,通常必须从构造函数的调用方传入它。正如您所发现的,
Class
,其中
R
是一个类型参数(通常用一个大写字母拼写),将不起作用。您必须从类型的
文本或编译器可以“查看”类型参数特定解析的实例中提取它。一旦您这样做了,那么您就拥有了运行时泛型的全部功能。(您也可以使用未经检查的强制类型转换来玩游戏,但这通常不是很好。)问题是。类不能用于具有类型的对象,因此没有
列表。类
但是
列表。类
可以。使用原始类型可能不是一个好主意,但如果使用它们,您可以正常扩展
SpiceRequest
,只需调用
super即可((Class)Response.Class)
public RetrofitRequest(Class<RESULT> clazz){
    super(clazz);
}
RetrofitRequest<String> impl = new RetrofitRequestImpl<String>(String.class);
public abstract class RetrofitRequest<RESULT> extends SpiceRequest<Response<RESULT>> {

    protected RetrofitRequest(){
        super((Class<Response<RESULT>>) (Class<?>) Response.class);
    }

    @Override
    public final Response<RESULT> loadDataFromNetwork() throws Exception {
        WebService webService = RestFulWebService.getRestFulWebService();
        return doInBackground(webService);
    }

    @WorkerThread
    protected abstract Response<RESULT> doInBackground(WebService webService) throws Exception;

}