Java 将JSONObject请求转换为请求

Java 将JSONObject请求转换为请求,java,android,generics,android-volley,abstract,Java,Android,Generics,Android Volley,Abstract,我通过返回一般请求类型的函数创建请求: public final class SpecificRequestService extends RequestService<JSONObject> { @Override protected Request<JSONObject> getRequest() { return new JsonObjectRequest(...); } } public final类SpecificReq

我通过返回一般请求类型的函数创建请求:

public final class SpecificRequestService extends RequestService<JSONObject> {
    @Override
    protected Request<JSONObject> getRequest() {
        return new JsonObjectRequest(...);
    }
}
public final类SpecificRequestService扩展了RequestService{
@凌驾
受保护的请求getRequest(){
返回新的JsonObjectRequest(…);
}
}
父类是抽象定义的:

public abstract class RequestService<T> {
    protected abstract Request<T> getRequest();
}
公共抽象类请求服务{
受保护的抽象请求getRequest();
}
我收到一个不兼容的类型错误:

必需:请求
发现:请求
希望,
JsonObjectRequest
扩展
JsonRequest
其中
JsonRequest
依次扩展
Request


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

我已经尝试使用您正在描述的类层次结构的一个简单的重新创建来重现您的问题,我没有得到编译错误。所以我假设在你的案件中还有其他一些东西是缺失的

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

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 {};
抽象类A{
公共摘要R getR();
}
最后的B类扩展了A类{
公共R getR(){
返回新的E();
}
}
类D扩展了R{};
类E扩展了D{};
类R{}
类X{};

使用javac1.8.x没有编译错误显然是内部匿名类重写导致了问题。我通过对重写函数进行自转换成功地修复了它:

public final class SpecificRequestService extends RequestService<JSONObject> {
    @Override
    protected Request<JSONObject> getRequest() {
        return (JsonObjectRequest) new JsonObjectRequest(...)
            {...};
    }
}
public final类SpecificRequestService扩展了RequestService{
@凌驾
受保护的请求getRequest(){
返回(JsonObjectRequest)新的JsonObjectRequest(…)
{...};
}
}

我不知道匿名类的这种特殊怪癖

你的代码无法编译。为了在类中声明抽象方法,应该将类声明为抽象的。最后的类也不能扩展。对不起,父类确实是抽象的,不是最终的。我的打字错误。我不明白为什么它不起作用。我试图通过创建一个等价的层次结构和一个虚拟类来重现您的问题,但我没有得到那个错误。也许您正在使用的类的层次结构中缺少一些模糊的细节?这可能是一个
JsonObjectRequest
特定的问题,但我设法通过强制转换解决了它(出于某种原因)。我把我的答案贴在下面。嗯,这似乎没有意义,但。。。我是说,演员们似乎什么都没做。没有给你任何警告吗?(例如“未经检查的演员阵容”或类似的内容)如果您将演员阵容排除在外会怎么样?内部类的把戏够了吗?@ValentinRuano离开被驱逐者会产生一个错误。拥有演员阵容不会产生任何“未经检查的演员阵容”错误…我相当无话可说。。。。可以发布您正在使用的java编译器版本(javac-version)。如果您使用的是IDE(例如Eclipse),您是否可以尝试使用javac从命令行编译它?
public final class SpecificRequestService extends RequestService<JSONObject> {
    @Override
    protected Request<JSONObject> getRequest() {
        return (JsonObjectRequest) new JsonObjectRequest(...)
            {...};
    }
}