@IntDef 注释和来自其他代码的return 值无法注释或如何暂时禁用注释影响代码?

@IntDef annotation and return value from other's code that cannot be annotated or how to temporarily disable annotation from affecting the code?

我在我的代码中使用 IntDef from Android Support annotation(但我的问题范围更广,所以请继续阅读 :) 像这样:

public class UiLockMode
{
    @IntDef({DEFAULT, NONE, VISIBLE, TRANSPARENT})
    @Retention(RetentionPolicy.SOURCE)
    public @interface AllowedValues {}

    public static final int DEFAULT     = 0;
    public static final int NONE        = 1;
    public static final int VISIBLE     = 2;
    public static final int TRANSPARENT = 3;
}

接下来,我得到了一些用它注释的其他方法:

protected void setLockMode(@UiLockMode.AllowedValues int lockMode) {
    ...

那时一切都很好,但每当我想将 return 值从其他方法传递给 setLockMode() 时,问题就会出现,比如从 Parcelable 实现:

private Foo(Parcel in) {
    ...
    setLockMode(in.getInt());

在这种情况下,我的 IDE 抱怨我只允许使用 DEFAULT, NONE, VISIBLE, TRANSPARENTsetLockMode()。但是 getInt() 不是我的方法,所以我无法注释它的 return 值并让这一切都开心。我也几乎可以肯定这不是唯一的用例,但我未能找到暂时禁用 AllowedValues 注释以防止此处抱怨或 "cast" return 来自 getInt() 值的方法让 AllowedValue 不抱怨。

所以我的问题是:有什么办法可以解决这个问题吗?也许我遗漏了一些关于注释的明显信息,但也许我应该创建错误报告来让 Google 解决这个问题?

感谢任何意见或想法。

您可以通过使用以下注释来抑制方法的 IntDef Lint 警告:

@SuppressWarnings("ResourceType")

您还可以针对单个语句和整个语句禁用这些警告 类 - 请参阅 Android Tools site 以获取更多文档。

如果仅通过在其上方插入 //noinspection ResourceType 来抑制针对该单个语句的警告,这不等同于 "making it understand the value returned by getInt() at this point is correct" 吗?

或者,您可以向 UiLockMode 添加一个从 int 转换为 @UiLockMode 的简单方法,例如类似于:

public @UiLockMode.AllowedValues static int lockModeTranslate(int val)
{
    switch(val)
    {
        case 0: return UiLockMode.DEFAULT;
        case 1: return UiLockMode.NONE;
        case 2: return UiLockMode.TRANSPARENT;
        case 3: return UiLockMode.VISIBLE;
    }

    throw new SomethingHorrible;
}

然后像 setLockMode(UiLockMode.lockModeTranslate(in.getInt())); 这样的调用将不再引起警告。