Я новичок в 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) в его подтип @Sub для нового строка s1, чтобы этот пример кода не выдавал ошибку.
Возможно ли это вообще с помощью Checker Framework? Я не мог найти способ сделать это просто путем определения новой аннотации, я что-то упустил? Может быть, это может быть достигнуто только путем написания совершенно новой проверки?