未编译带有通配符的Java泛型

未编译带有通配符的Java泛型,java,generics,compiler-errors,callback,wildcard,Java,Generics,Compiler Errors,Callback,Wildcard,我制作了这个简化的真实代码示例,它不是编译: public class Example { public static void main(String[] args) { Callback<BalanceResponse> balanceRequestCaller = new Callback<BalanceResponse>() { @Override public void onRespons

我制作了这个简化的真实代码示例,它不是编译:

public class Example {

    public static void main(String[] args) {
        Callback<BalanceResponse> balanceRequestCaller = new Callback<BalanceResponse>() {
            @Override
            public void onResponse(BalanceResponse response) {}

            @Override
            public void onFailure(String error, int code) {}

            @Override
            public void onFailure(Throwable t) {}
        };

        BalanceRequest breq = new BalanceRequest();

        Interceptor interceptor = new Interceptor(balanceRequestCaller);

        breq.startRequest((Callback<BaseResponse>) interceptor); //compile-time error!!!
    }


    public static class Interceptor implements Callback<BaseResponse> {

        public Interceptor(Callback<? extends BaseResponse> originalCaller) {
            this.originalCaller = originalCaller;
        }

        private Callback<? extends BaseResponse> originalCaller;

        @Override
        public void onResponse(BaseResponse response) {
            //do some interception stuff

            if (response instanceof BalanceResponse) {
                ((Callback<BalanceResponse>) originalCaller).onResponse((BalanceResponse) response);
            } else if (response instanceof SubscriptionResponse) {
                ((Callback<SubscriptionResponse>) originalCaller).onResponse((SubscriptionResponse) response);
            }
        }

        @Override
        public void onFailure(String error, int code) {}

        @Override
        public void onFailure(Throwable t) {}
    }

    public interface Request<T extends BaseResponse> {
        void startRequest(Callback<T> callback);
    }

    public static class BalanceRequest implements Request<BalanceResponse> {
        @Override
        public void startRequest(Callback<BalanceResponse> callback) {}
    }

    public static class SubscriptionRequest implements Request<SubscriptionResponse> {
        @Override
        public void startRequest(Callback<SubscriptionResponse> callback) {}
    }

    public static class BaseResponse {
        public String status;
    }

    public static class BalanceResponse extends BaseResponse {

    }

    public static class SubscriptionResponse extends BaseResponse {

    }

    public interface Callback<T> {
        void onResponse(T response);
        void onFailure(String error, int code);
        void onFailure(Throwable t);
    }
}
给我一些建议,我怎样才能做到这一点?

您应该在类
拦截器
上定义一个类型参数,以防止编译错误,并避免在方法
onResponse
中显式强制转换,这通常是一个设计证明问题

具有类型参数的拦截器类:

公共静态类拦截器实现回调{
公共侦听器(回调原始调用器){
this.originalCaller=originalCaller;
}
私有回调原始调用程序;
@凌驾
公共响应(T响应){
原始调用器onResponse(response);
}
...
}
然后将其实例化并用作下一步:

Interceptor<BalanceResponse> interceptor = new Interceptor<>(balanceRequestCaller);
breq.startRequest(interceptor);
Interceptor-Interceptor=新的拦截器(balanceRequestCaller);
breq.startRequest(拦截器);

startRequest()的签名更改为

void startRequest(Callback<? super T> callback);
Interceptor<BalanceResponse> interceptor = new Interceptor<>(balanceRequestCaller);
breq.startRequest(interceptor);
void startRequest(Callback<? super T> callback);
@Override
public void onResponse(BaseResponse response) {
    //do some interception stuff
    ((Callback<BaseResponse>)originalCaller).onResponse(response);
}