将JsonObjectRequest转换为Request

时间:2017-03-09 18:55:17

标签: java android generics android-volley abstract

我通过一个返回通用Request类型的函数创建一个Request:

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

父类是抽象定义:

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>

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

2 个答案:

答案 0 :(得分:1)

我尝试使用您正在描述的类层次结构的裸骨重新创建来重现您的问题,我没有收到编译错误。所以我假设你的案件还有其他东西丢失了。

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

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无编译错误

答案 1 :(得分:0)

显然内部匿名类覆盖会导致问题。我设法在覆盖函数上使用自我修复来修复它:

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

我不知道这个匿名课程的特殊怪癖!