如何使用方法引用作为未来的回调?
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>
匿名class作为监听器没有错误
asyncMethod().addListener(new GenericFutureListener<Future<String>>() {
@Override
public void operationComplete(Future<String> future) throws Exception {
System.out.println(future.getNow());
}
});
但它又丑又冗长:(我该怎么做才能以最优雅的方式解决这个问题?
您的选择是:
- 使用 lambda(比完全匿名 class 更短,但仍然不是最优的):
asyncMethod().addListener((GenericFutureListener<Future<String>>) future -> Application.callback(future))
- 将回调的参数修改为:
private static void callback(Future<? super String> future) {
从简单的Future<String> future
开始,这样你也可以使用回调。
注意:如果您对 ? extends vs ? super
泛型问题感到困惑,出于同样的原因,我已将 this SO post 加入书签。
可以参考投射方法
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。
当我尝试使用这样的东西时
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>
匿名class作为监听器没有错误
asyncMethod().addListener(new GenericFutureListener<Future<String>>() {
@Override
public void operationComplete(Future<String> future) throws Exception {
System.out.println(future.getNow());
}
});
但它又丑又冗长:(我该怎么做才能以最优雅的方式解决这个问题?
您的选择是:
- 使用 lambda(比完全匿名 class 更短,但仍然不是最优的):
asyncMethod().addListener((GenericFutureListener<Future<String>>) future -> Application.callback(future))
- 将回调的参数修改为:
private static void callback(Future<? super String> future) {
从简单的Future<String> future
开始,这样你也可以使用回调。
注意:如果您对 ? extends vs ? super
泛型问题感到困惑,出于同样的原因,我已将 this SO post 加入书签。
可以参考投射方法
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。