Java Checkerframework替换注释

Java Checkerframework替换注释,java,annotations,checker-framework,Java,Annotations,Checker Framework,我是Checker框架的新手,我定义了2个子类型注释,如下所示: @Target(value={TYPE_USE,TYPE_PARAMETER}) @DefaultQualifierInHierarchy @SubtypeOf(value={}) public @interface Base{} public static void main(String args[]) { String s0 = "a"; @ToSub String s1 = s0; sink(s1

我是Checker框架的新手,我定义了2个子类型注释,如下所示:

@Target(value={TYPE_USE,TYPE_PARAMETER})
@DefaultQualifierInHierarchy
@SubtypeOf(value={})
public @interface Base{}
public static void main(String args[]) {
    String s0 = "a";
    @ToSub String s1 = s0;
    sink(s1);
}

public static void sink(@Sub String s) {}

当我在下面的代码中使用带有这些注释的子类型检查器时,它会产生一个错误,因为sink()需要一个标记为@Sub的字符串,但会收到@Base(字符串s0的默认值),这是预期的行为

public static void main(String args[]) {
    String s0 = "a";
    sink(s0);
}

public static void sink(@Sub String s) {}
现在,我想添加第三个注释,称为@ToSub,并像这样使用它:

@Target(value={TYPE_USE,TYPE_PARAMETER})
@DefaultQualifierInHierarchy
@SubtypeOf(value={})
public @interface Base{}
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框架中是可能的吗?
我无法简单地通过定义一个新的注释来实现这一点,我错过了什么吗?这可能只能通过编写一个全新的检查器来实现吗?

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


更一般地说,如果要抑制警告,请参阅Checker Framework手册的。

基本上是的,但我不想在代码中明确地写入
@SuppressWarnings(“子类型”)
。相反,我想声明一个新的注释,在本例中为
@ToSub
,它与子类型
@Sub
具有相同的功能,但也抑制了警告。使用
@SuppressWarnings
作为
@ToSub
的元注释似乎不是一个选项。创建一个
ToSub
方法,该方法采用
@Base
并将其参数作为
@Sub
返回,如何?(您可以在其定义上编写
@SuppressWarnings
,Java编译器非常聪明,可以对其进行优化。然后您可以编写
字符串s1=toSub(s0)
。这会起作用,但我特别希望使用自定义注释来实现这一点,因为我希望将此功能与我编写的编译器插件一起使用,该插件也使用相同的自定义注释。为此,请定义一个类型层次结构,其中包括所有3个限定符,并在yo中重写
commonAssignmentCheck
你的检查者的访客类。