我是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) {}
此第三个注释应该将新的字符串s1的当前类型s0(@Base)转换为其子类型@Sub,因此该代码示例不会引发错误。
Checker Framework完全可行吗?我无法通过定义新注释来找到实现此目的的方法,我错过了什么吗?能否仅通过编写全新的检查器来完成?
您似乎正在寻找Java现有的@SuppressWarnings
批注。