Java @IntDef注释和其他';s无法注释的代码,或者如何临时禁用注释以避免影响代码?

Java @IntDef注释和其他';s无法注释的代码,或者如何临时禁用注释以避免影响代码?,java,android,annotations,android-support-library,android-lint,Java,Android,Annotations,Android Support Library,Android Lint,我在代码中使用from(但我的问题范围更广,所以请继续阅读:)如下: public class UiLockMode { @IntDef({DEFAULT, NONE, VISIBLE, TRANSPARENT}) @Retention(RetentionPolicy.SOURCE) public @interface AllowedValues {} public static final int DEFAULT = 0; public sta

我在代码中使用from(但我的问题范围更广,所以请继续阅读:)如下:

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) {
    ...
接下来,我用它注释了一些其他方法,如下所示:

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) {
    ...
在这一点上,一切都很好,但每当我想将其他方法的返回值传递到
setLockMode()
,比如从Parcelable实现传递时,问题就会出现:

private Foo(Parcel in) {
    ...
    setLockMode(in.getInt());
在这种情况下,我的IDE抱怨我只允许使用
DEFAULT、NONE、VISIBLE、TRANSPARENT
setLockMode()
。但是
getInt()
不是我的方法,所以我不能注释它的返回值并让所有这些都满意。我也几乎可以肯定这不是唯一的用例,但我没有找到方法暂时禁用
AllowedValue
注释以避免在此处抱怨,或者从
getInt()
中“强制”返回值以确保
AllowedValue
不抱怨

所以我的问题是:有没有办法解决这个问题?也许我遗漏了一些明显的注释,但也许我应该创建bug报告,让谷歌解决这个问题


任何输入或想法都值得赞赏。

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

@SuppressWarnings("ResourceType")

您还可以对单个语句和整个类禁用这些警告—有关更多文档,请参阅。

如果您仅通过在单个语句上方插入
//noinspection ResourceType
来抑制该语句的警告,这是否等同于“让它理解
getInt()返回的值”
此时是否正确“

或者,您可以向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())将不再引起警告。

谢谢您的回答,+1。是的,我知道我可以抑制警告,但我不想,除非我没有其他选择,因此,基本上我想知道是否有其他方法可以解决我的问题。我想你可以尝试扩展Parcel,在其中添加myGetInt方法。只是检查和扩展不是一种方法,因为你仍然会看到抱怨,因为注释使它期望
int
不是一种方法。好吧,抑制不是一种等价的说法“这是一个正确的值”。这通常是一种表示“我真的不能检查它”或“我不在乎它是否有效”的方式(主要是因为“我真的不能检查它”)。您的代码将关闭投诉,但这是一种解决方法,而不是一种解决方案。如果我想自动生成此内容(使用其他注释)那也许没问题,但其他方面抑制就更清楚了。当然,太糟糕了……黑魔法:public@UiLockMode.AllowedValues static int lockModeTranslate(int val){return val;}@hrules6872但是如果你传递了不支持的值呢?喜欢这个解决方案,因为它会抛出一些可怕的异常,而不是未执行的结果