简体   繁体   English

泛型参数作为方法参数

[英]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 ): 并且必须创建不同类型的对象( SubscribeTradesResponseSubscribeOrderResponse ):

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()并传递SubscribeTradesResponseSubscribeOrderResponse作为参数?

You can do even better by using lambda expressions, which will allow you to get rid of getTradesResponseStream and getOrderResponseStream : 通过使用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;

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接口,即您可以使用它来处理SubscribeTradesResponseSubscribeOrderResponse对象。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM