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 的超类型=].
使用 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 的超类型=].