[英]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.