java - 如何使用方法引用作为 future 的回调?

标签 java generics netty

当我尝试使用这样的东西时

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);

它不那么冗长,但仍然不完美。要稍微改进此解决方案,您可以将长类型定义移至功能接口(interface)

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。

关于java - 如何使用方法引用作为 future 的回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54229736/

相关文章:

java - 如何让 GRPC 服务器在另一个 Web 服务器(不是 Netty)上运行

java - 排除子目录的过滤器映射 url-pattern

java - 无法在我的模板文件中获取资源文件(使用 ReSTLet 和 Freemarker)

java - Wicket动态添加组件到表单

java - 如何克隆 xml 文件(完全相同的副本)

java - 具有实例变量的通用内部类,该实例变量是另一个通用内部类的对象

ios - 在 Swift 中使用协议(protocol)作为类型时出错

c# - Autofac 注册通用委托(delegate)工厂

netty - 代表连接到 netty 服务器的客户端

java - Netty ByteBuf 到 byte[] 解码器