我是 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]