Checker Framework 将@Initialized 值作为@UnderInitialization 参数传递

Checker Framework passing @Initialized value as @UnderInitialization parameter

使用 Checker Framework,构造函数使用的方法可以采用 @UnderInitialization 个带注释的参数。

从非构造函数调用此类方法并向其传递 @Initialized 参数会导致以下错误:

error: [argument.type.incompatible] incompatible types in argument.

found   : @Initialized <Object>
required: @UnderInitialization <Object>

我不确定这是不是一个问题,因为传递 @Initialized 值不应该有副作用。

解决此错误的正确方法是什么?

我觉得类型检查警告很正确。

要理解这个问题,请考虑 type hierarchy of the initialization type system@Initialized and @UnderInitialization 是类型层次结构中的兄弟姐妹。在需要 @UnderInitialization 时提供 @Initialized 并不比在需要 Date 时提供 List 更合法。

如果您的方法适用于已初始化的值和正在初始化的值,那么您可以将其参数注释为 @UnknownInitialization,它是 @Initialized 和 [=11 的超类型=].