繁体   English   中英

泛型参数作为方法参数

[英]Generic type parameter as method argument

我有通用接口:

public interface StreamObserver<V>  {
    void onNext(V value);
}

并且必须创建不同类型的对象( SubscribeTradesResponseSubscribeOrderResponse ):

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

通过使用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;

假定您相应地重载了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接口,即您可以使用它来处理SubscribeTradesResponseSubscribeOrderResponse对象。

暂无
暂无

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

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