簡體   English   中英

如何使用方法引用作為將來的回調?

[英]How to use method reference as future callback?

當我嘗試使用這樣的東西

class Example {
    ...

    private Future<String> asyncMethod() {
        ...
        return somePromise;
    }

    private static void callback(Future<String> future) {
        System.out.println(future.getNow());
    }

    public static void main(String[] args) {
        asyncMethod().addListener(Example::callback);
    }
}

我得到一個錯誤

Example.java:[17,34] incompatible types: invalid method reference
   incompatible types: io.netty.util.concurrent.Future<capture#1 of ? super java.lang.String>
   cannot be converted to io.netty.util.concurrent.Future<java.lang.String>

匿名類作為偵聽器沒有任何錯誤

asyncMethod().addListener(new GenericFutureListener<Future<String>>() {
    @Override
    public void operationComplete(Future<String> future) throws Exception {
        System.out.println(future.getNow());
    }
});

但這很丑陋和冗長:(我該怎么做才能以最優雅的方式解決這個問題?

您可以強制轉換方法參考

asyncMethod().addListener((GenericFutureListener<Future<String>>) Example::callback);

它不那么冗長,但仍然不夠完美。 為了稍微改善此解決方案,您可以將長類型定義移至功能接口

class Example {
    @FunctionalInterface
    private interface Callback extends GenericFutureListener<Future<String>> {
        void operationComplete(Future<String> future) throws Exception;
    }

    private static void callback(Future<String> future) {
        System.out.println(future.getNow());
    }

    public static void main(String[] args) {
        asyncMethod().addListener((Callback) Example::callback);
    }
}

或者您可以使用類型化的參數將回調包裝到lambda

asyncMethod().addListener((Future<String> f) -> callback(f));

IDK,也許可以做得更好。

您可以選擇以下任一種:

  1. 使用lambda (比完整的匿名類短,但仍然不是最佳):

asyncMethod().addListener((GenericFutureListener<Future<String>>) future -> Application.callback(future))

  1. 將回調的參數固定為:

private static void callback(Future<? super String> future) {

從簡單的Future<String> future ,您也可以使用回調方法。

注意:如果您對? extends vs ? super ? extends vs ? super ? extends vs ? super泛型問題,出於同樣的原因,我也為此貼了書簽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM