如何使用Type Qualifiers和Checker Framework实现Micro Types?

时间:2016-09-21 15:49:22

标签: java 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 : 看起来我需要使用" 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]

0 个答案:

没有答案