0

我是 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 是否有可能?我无法通过定义一个新的注释来完成这个任务,我错过了什么吗?这只能通过编写一个全新的检查器来完成吗?

4

1 回答 1

1

您似乎正在寻找 Java 的现有@SuppressWarnings注释。

更一般地,如果您想抑制警告,请参阅 Checker Framework 手册的“抑制警告”一章

于 2020-02-17T14:14:13.350 回答