我是 Checker Framework 的新手,我已经定义了 2 个子类型注释,如下所示:
@Target(value={TYPE_USE,TYPE_PARAMETER})
@DefaultQualifierInHierarchy
@SubtypeOf(value={})
public @interface Base{}
和
@Target(value={TYPE_USE,TYPE_PARAMETER})
@SubtypeOf(value=Base.class)
@DefaultFor(value=LOWER_BOUND)
public @interface Sub{}
当我在以下代码上使用带有这些注释的子类型检查器时,它会产生错误,因为 sink() 需要一个标记为 @Sub 的字符串,但接收到 @Base(String s0 的默认值),这是预期的行为。
public static void main(String args[]) {
String s0 = "a";
sink(s0);
}
public static void sink(@Sub String s) {}
现在我想添加第三个注释,例如称为 @ToSub 并像这样使用它:
public static void main(String args[]) {
String s0 = "a";
@ToSub String s1 = s0;
sink(s1);
}
public static void sink(@Sub String s) {}
这第三个注释应该将当前类型的 s0 (@Base) 转换为新字符串 s1 的子类型 @Sub,以便此代码示例不会引发错误。
使用 Checker Framework 是否有可能?我无法通过定义一个新的注释来完成这个任务,我错过了什么吗?这只能通过编写一个全新的检查器来完成吗?