[英]Generic type parameter as method argument
I have generic interface: 我有通用接口:
public interface StreamObserver<V> {
void onNext(V value);
}
And have to create objects for different types ( SubscribeTradesResponse
and SubscribeOrderResponse
): 并且必须创建不同类型的对象( SubscribeTradesResponse
和SubscribeOrderResponse
):
1) 1)
StreamObserver<SubscribeTradesResponse> getTradesResponseStream() {
return new StreamObserver<SubscribeTradesResponse>() {
@Override
public void onNext(SubscribeTradesResponse response) {
responseOnNextAction(response);
}
};
}
2) 2)
StreamObserver<SubscribeOrderResponse> getOrderResponseStream() {
return new StreamObserver<SubscribeOrderResponse>() {
@Override
public void onNext(SubscribeOrderResponse response) {
responseOnNextAction(response);
}
};
}
Is it possible to make a common method getResponseStream()
and pass SubscribeTradesResponse
or SubscribeOrderResponse
as an argument? 是否可以使通用方法getResponseStream()
并传递SubscribeTradesResponse
或SubscribeOrderResponse
作为参数?
You can do even better by using lambda expressions, which will allow you to get rid of getTradesResponseStream
and getOrderResponseStream
: 通过使用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;
That assumes you have overloaded responseOnNextAction
accordingly. 假定您相应地重载了responseOnNextAction
。
But if you were to use the inner classes, you can still make the method generic: 但是,如果要使用内部类,则仍然可以使方法通用:
<T> StreamObserver<T> getTradesResponseStream() {
return new StreamObserver<T>() {
@Override
public void onNext(T response) {
responseOnNextAction(response);
}
};
}
But this depends on the signature of responseOnNextAction
. 但这取决于responseOnNextAction
的签名。 It will work as is if the method takes an Object
, but if it takes a Response
of a sort, you may have to change the type parameter to 如果该方法采用Object
,它将按原样工作,但是如果采用某种Response
,则可能必须将type参数更改为
<T extends Response>
You can create a common interface for the two response types: 您可以为两种响应类型创建一个公共接口:
interface TradeOrOrderResponse {
}
with 同
class SubscribeTradesResponse implements TradeOrOrderResponse
and 和
class SubscribeOrderResponse implements TradeOrOrderResponse
and then extend your observer-interface 然后扩展您的观察者界面
public interface TOResponseObserver extends StreamObserver<V extends TradeOrOrderResponse> {
void onNext(V value);
}
and if your responseOnNextAction
takes that interface 并且如果您的responseOnNextAction
采用该接口
void responseOnNextAction(TradeOrOrderResponse resp)
it implements the TOResponseObserver
interface, ie you can use it to handle either SubscribeTradesResponse
or SubscribeOrderResponse
objects. 它实现了TOResponseObserver
接口,即您可以使用它来处理SubscribeTradesResponse
或SubscribeOrderResponse
对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.