![](/img/trans.png)
[英]How to access an annotation on a generic type parameter of a method argument?
[英]Generic type parameter as method argument
我有通用接口:
public interface StreamObserver<V> {
void onNext(V value);
}
並且必須創建不同類型的對象( SubscribeTradesResponse
和SubscribeOrderResponse
):
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()
並傳遞SubscribeTradesResponse
或SubscribeOrderResponse
作為參數?
通過使用lambda表達式,您甚至可以做得更好,這將使您擺脫getTradesResponseStream
和getOrderResponseStream
:
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
接口,即您可以使用它來處理SubscribeTradesResponse
或SubscribeOrderResponse
對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.