将 JsonObjectRequest 转换为请求

Cast JsonObjectRequest to Request

我通过 returns 通用请求类型的函数创建请求:

public final class SpecificRequestService extends RequestService<JSONObject> {
    @Override
    protected Request<JSONObject> getRequest() {
        return new JsonObjectRequest(...);
    }
}

父class抽象定义:

public abstract class RequestService<T> {
    protected abstract Request<T> getRequest();
}

我收到一个不兼容的类型错误:

Required: Request <org.json.JSONObject>  
Found: Request <?>

Hopwever,JsonObjectRequest 扩展了 JsonRequest<JSONObject>,其中 JsonRequest<T> 又扩展了 Request<T>

为什么子class中的类型在抱怨?

我已尝试使用您描述的 class 层次结构的简单重建来重现您的问题,但我没有遇到编译错误。所以我假设您的案例中还缺少其他东西。

我在这里包含我的代码,以便您确认我们在同一页面上:

abstract class A<T> {
    public abstract R<T> getR();
}
final class B extends A<X> {
   public R<X> getR() {
      return new E();
   }
}
class D<T> extends R<T> {};
class E extends D<X> {};
class R<T> {}
class X {};

使用javac 1没有编译错误。8.x

显然是内部匿名 class 覆盖导致了问题。我设法使用覆盖函数上的自我转换来修复它:

public final class SpecificRequestService extends RequestService<JSONObject> {
    @Override
    protected Request<JSONObject> getRequest() {
        return (JsonObjectRequest) new JsonObjectRequest(...)
            {...};
    }
}

我不知道这个匿名的怪癖 classes!