我有通用接口:
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
作为参数?
答案 0 :(得分:2)
通过使用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
,则可能必须将类型参数更改为
<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
接口,即,您可以使用它来处理SubscribeTradesResponse
或SubscribeOrderResponse
对象。