Как реализовать 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]

0 ответов

Другие вопросы по тегам