如何将@IntRange() 支持注释应用于 Kotlin 属性设置器

Mos*_*ses 10 android kotlin android-lint android-annotations kotlin-interop

我一直试图找出如何申请@IntRange(from = 1)我的 Kotlin 财产。经过几次失败的尝试,我终于在 Java 中创建了我想要的类,并将其转换为 Android Studio 中的 Kotlin。这是我的 Java 类:

import android.support.annotation.IntRange;

public class SimpleThing {

    private int val;

    @IntRange(from = 1)
    public int getVal() {
        return val;
    }

    public void setVal(@IntRange(from = 1) int val) {
        this.val = val;
    }

}
Run Code Online (Sandbox Code Playgroud)

这是我从 Android Studio 得到的自动转换:

import android.support.annotation.IntRange

class SimpleThing {

    @get:IntRange(from = 1)
    var `val`: Int = 0

}
Run Code Online (Sandbox Code Playgroud)

@IntRange似乎得到应用吸气剂,但不二传手。是否可以将此注释也应用于 setter,以便出现适当的 lint 警告。目前我刚刚覆盖了 set 方法来抛出一个 IllegalArgumentException 像这样:

@get:IntRange(from = 1)
var rowSize: Int = 3
    set(value) {
        if (value < 1) throw IllegalArgumentException("row size must be at least 1")
        field = value
        notifyDataSetChanged()
    }
Run Code Online (Sandbox Code Playgroud)

我已经尝试添加@set:IntRange(from = 1)但我收到错误,This annotation does not apply for type void因为它试图应用于@IntRange返回值(在 setter 的情况下为 void)而不是 setter 参数。

Mos*_*ses 5

@setparam注释似乎正是我要找的,但是当我尝试到指定范围之外的值没有皮棉警告Android Studio中提出。

这是我的新代码:

@get:IntRange(from = 1)
@setparam:IntRange(from = 1)
var rowSize: Int = 3
    set(value) {
        if (value < 1) throw IllegalArgumentException("row size must be at least 1")
        field = value
        notifyDataSetChanged()
    }
Run Code Online (Sandbox Code Playgroud)

在这里我通常希望看到一个 lint 警告,告诉我我正在分配一个 int 范围之外的值

在此处输入图片说明

但是,在 Kotlin 代码中使用 SimpleThing 类时确实会出现 lint 警告

在此处输入图片说明

将 Kotlin 方法作为 Java 代码调用时也不会出现 lint 警告

在此处输入图片说明

看起来这个功能还没有实现。


小智 0

目前无法测试这一点,但是您是否尝试过添加一个@set,如下所示:

@set:IntRange(from = 1)
@get:IntRange(from = 1)
    var `val`: Int = 0
Run Code Online (Sandbox Code Playgroud)