0

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

0 回答 0