泛型参数作为方法参数

时间:2018-08-15 07:14:14

标签: java generics arguments

我有通用接口:

public interface StreamObserver<V>  {
    void onNext(V value);
}

并且必须创建不同类型的对象({{1}  和SubscribeTradesResponse):

1)

SubscribeOrderResponse

2)

StreamObserver<SubscribeTradesResponse> getTradesResponseStream() {
    return new StreamObserver<SubscribeTradesResponse>() {
        @Override
        public void onNext(SubscribeTradesResponse response) {
            responseOnNextAction(response);
        }
    };
}

是否可以使用通用方法StreamObserver<SubscribeOrderResponse> getOrderResponseStream() { return new StreamObserver<SubscribeOrderResponse>() { @Override public void onNext(SubscribeOrderResponse response) { responseOnNextAction(response); } }; } 并通过getResponseStream()SubscribeTradesResponse作为参数?

2 个答案:

答案 0 :(得分:2)

通过使用lambda表达式,您甚至可以做得更好,这将使您摆脱getTradesResponseStreamgetOrderResponseStream

StreamObserver<SubscribeTradesResponse>  tradeObserver= response -> 
      responseOnNextAction(response);
//or
StreamObserver<SubscribeTradesResponse>  tradeObserver= 
      this::responseOnNextAction;

StreamObserver<SubscribeOrderResponse> orderObserver = response -> 
      responseOnNextAction(response);
//or
StreamObserver<SubscribeOrderResponse> orderObserver = 
      this::responseOnNextAction;

假定您已相应地responseOnNextAction超载。

但是,如果您要使用内部类,则仍然可以使方法通用:

<T> StreamObserver<T> getTradesResponseStream() {
    return new StreamObserver<T>() {
        @Override
        public void onNext(T response) {
            responseOnNextAction(response);
        }
    };
}

但这取决于responseOnNextAction的签名。如果方法采用Object,它将按原样工作,但是如果采用某种Response,则可能必须将类型参数更改为
<T extends Response>

答案 1 :(得分:2)

您可以为两种响应类型创建一个公共接口:

interface TradeOrOrderResponse {
}

使用

class SubscribeTradesResponse implements TradeOrOrderResponse

class SubscribeOrderResponse implements TradeOrOrderResponse

然后扩展您的观察者界面

public interface TOResponseObserver extends StreamObserver<V extends TradeOrOrderResponse>  {
    void onNext(V value);
}

,如果您的responseOnNextAction使用该界面

void responseOnNextAction(TradeOrOrderResponse resp)

它实现了TOResponseObserver接口,即,您可以使用它来处理SubscribeTradesResponseSubscribeOrderResponse对象。