0

我应该如何使用检查器框架类型的注释处理 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));
    }

Checker 将argument.type.incompatible在线路呼叫上发出警告runDispatch,即使layer事先正在检查。我知道 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>

runDispatch在同一个类上声明,签名private void runDispatch(Progress progress, Load request, Layer layer)

另一个例子: 在我的代码的其他地方我有类似的情况,但涉及方法行为:

Item.class

    @EnsuresNonNullIf(expression="extraAction", result=true)
    public final boolean hasExtraAction() {
        return extraAction != null;
    }

在一个单独的班级:

    @RequiresNonNull("#2.extraAction")
    private void buildExtraActionRunnable(Layer layer, Item item, Deliver deliver) {
    ....
    }



    ...
    } else if (item.hasExtraAction()) {
            Runnable r = () -> buildExtraActionRunnable(layer, item, deliver);

在这里,在 Runnable 行我得到error: [contracts.precondition.not.satisfied] the called method 'buildExtraActionRunnable(layer, item, deliver)' has a precondition 'item.extraAction' that is not satisfied

4

1 回答 1

1

我同意这是Nullness Checker中的一个错误。在这部分代码中:

    Utils.log("DISPATCHING " + layer.name);
    JThread.run(() -> runDispatch(progress, request, layer));

Nullness Checker 在调用时知道Utils.log它是非空的,但它在调用方法体内layer时不知道该事实。runDispatch在方法体中,它使用的是声明的类型,layer而不是通过数据流分析计算的精炼类型。

您的问题是如何解决 Checker Framework 错误。一种方法是引入一个新变量:

    Utils.log("DISPATCHING " + layer.name);
    Layer layer2 = layer;  // work around CF issue #1248
    JThread.run(() -> runDispatch(progress, request, layer2));

上面的代码类型检查正确。

我无法为您的第二个示例提供详细答案,因为您没有提供可编译的 MWE。但是每当表格出现错误时error: [KEY] ...,您总是可以通过添加来抑制它@SuppressWarnings("KEY")。这是你的情况,这将是@SuppressWarnings("contracts.precondition.not.satisfied")

于 2017-04-21T02:23:34.717 回答