Как реализовать Micro Types, используя Type Qualifiers и Checker Framework?
Я довольно новичок в Checker Framework, поэтому я могу сделать что-то совершенно не так.
Я хотел бы избавиться от микротипов в нашей модели, поэтому вместо того, чтобы писать
private TypeAId id;
Я хотел бы написать что-то вроде
private @TypeAId String id;
поскольку все ключи являются строками или могут быть представлены в виде строк.
Как правильно это сделать? Я читаю документацию об иерархии и границах классификатора, но все это кажется слишком сложным, и я просто не понимаю основ.
Мне нужны простые аннотации, такие как @TypeAId, @TypeBId и т. Д., Поэтому приведенный ниже код должен вызывать ошибки во время компиляции:
@TypeAId String aId;
@TypeBId String bId = "B_ID";
String justString = "JUST_A_STRING";
aId = bId; // Fail
aId = justString; // Fail
ОБНОВЛЕНИЕ 1: Похоже, мне нужно использовать "Подтип", но я не понимаю, как писать аннотации подтипов, поэтому будет применяться следующее:
@TypeAId String aId;
@TypeBId String bId = "B_ID";
String justString = "JUST_A_STRING";
aId = bId; // Fail
aId = justString; // Fail
justString = aId; // Pass, because @TypeAId is a "subtype" of String
ОБНОВЛЕНИЕ 2: На данный момент у меня есть:
@DefaultQualifierInHierarchy
@SubtypeOf({})
@ImplicitFor(literals = {LiteralKind.NULL, LiteralKind.STRING})
@DefaultFor({TypeUseLocation.LOWER_BOUND})
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
public @interface ObjectId {
}
@SubtypeOf({ObjectId.class})
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
public @interface TypeA {
}
@SubtypeOf({ObjectId.class})
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
public @interface TypeB {
}
private Map<@TypeA String, SomeObject> someObjects;
И получить:
error: [type.argument.type.incompatible] incompatible types in type argument.
private Map<@TypeA String, SomeObject> someObjects;
^
found : @TypeA String
required: [extends @ObjectId Object super @ObjectId null]