我是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 : 看起来我需要使用" Subtyping",但我不了解如何编写子类型注释,因此以下内容适用:
@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]