Java 8 处理函数接口lambda中的@Nullable

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

我应该如何使用checker框架类型的注释处理lambda函数

比如说,

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