簡體   English   中英

泛型參數作為方法參數

[英]Generic type parameter as method argument

我有通用接口:

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

並且必須創建不同類型的對象( SubscribeTradesResponseSubscribeOrderResponse ):

1)

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

2)

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

是否可以使通用方法getResponseStream()並傳遞SubscribeTradesResponseSubscribeOrderResponse作為參數?

通過使用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 ,則可能必須將type參數更改為
<T extends Response>

您可以為兩種響應類型創建一個公共接口:

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對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM