Java 8 处理函数接口lambda中的@Nullable
我应该如何使用checker框架类型的注释处理lambda函数 比如说,Java 8 处理函数接口lambda中的@Nullable,java-8,checker-framework,Java 8,Checker Framework,我应该如何使用checker框架类型的注释处理lambda函数 比如说, private void dispatch(Progress progress, Load request, @Nullable Layer layer) { if (layer == null) return; Utils.log("DISPATCHING " + layer.name); JThread.run(() -> runDispatch(prog
private void dispatch(Progress progress, Load request, @Nullable Layer layer)
{
if (layer == null) return;
Utils.log("DISPATCHING " + layer.name);
JThread.run(() -> runDispatch(progress, request, layer));
}
检查程序将在runDispatch行调用上发出argument.type.compatible警告,即使事先检查了层。我知道lambda函数位于不同的上下文中,因此Checker无法正确评估它。最好的处理方法是什么
额外信息
全面警告:
error: [argument.type.incompatible] incompatible types in argument.
[ERROR] found : @Initialized @Nullable Layer<? extends @Initialized @NonNull Item, ? extends @Initialized @NonNull Deliver, ? extends @Initialized @NonNull Recipient>
[ERROR]
[ERROR] required: @Initialized @NonNull Layer<? extends @Initialized @NonNull Item, ? extends @Initialized @NonNull Deliver, ? extends @Initialized @NonNull Recipient>
在单独的课堂上:
@RequiresNonNull("#2.extraAction")
private void buildExtraActionRunnable(Layer layer, Item item, Deliver deliver) {
....
}
...
} else if (item.hasExtraAction()) {
Runnable r = () -> buildExtraActionRunnable(layer, item, deliver);
在这里,在Runnable行我得到错误:[contracts.Premission.not.Suited]被调用的方法“BuildExtractionRunnablayer,item,deliver”有一个不满足的Premissions“item.Extraction”我同意这是。
在代码的这一部分中:
Utils.log("DISPATCHING " + layer.name);
JThread.run(() -> runDispatch(progress, request, layer));
null检查器在调用Utils.log时知道该层为非null,但在调用方法体中的runDispatch时却不知道这一事实。在方法体中,它使用声明的层类型,而不是通过数据流分析计算的细化类型
您的问题是如何解决Checker框架缺陷。
一种方法是引入一个新变量:
Utils.log("DISPATCHING " + layer.name);
Layer layer2 = layer; // work around CF issue #1248
JThread.run(() -> runDispatch(progress, request, layer2));
以上代码类型检查正确
我无法给出第二个示例的详细答案,因为您没有给出可编译的MWE。但无论何时出现错误[KEY]…,您都可以通过添加@suppressWarningKey来抑制它。如果是您的情况,这将是@SuppressWarningContracts.Predition.not.Successed.发出的确切警告是什么?那么,runDispatch是如何定义的呢?如果您可以提供一个完整的可编译文件形式的MWE,那将非常有用。@mernst添加到我的答案中。提供MWE有点困难,因为有很多依赖项,但是如果仍然有必要,请询问我。在第一个示例中,layer必须是lambda表达式捕获的有效最终层,因此检查后它不能更改为null。lambda表达式的原理不同于内部类,变量不存在于不同的上下文中。我认为未能识别有效性是检查者的缺陷。第二个例子并不那么清楚。如果item.extraction是可变的,则无法证明其有效性,除非Runnable永远不会超出If语句的范围。谢谢。对于示例2中的方法行为,您是否有变通建议?
Utils.log("DISPATCHING " + layer.name);
Layer layer2 = layer; // work around CF issue #1248
JThread.run(() -> runDispatch(progress, request, layer2));