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

时间:2018-05-01 11:51:40

标签: android kotlin android-annotations android-lint 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;
    }

}

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

import android.support.annotation.IntRange

class SimpleThing {

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

}

@IntRange似乎应用于getter但不应用于setter。是否可以将此注释也应用于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()
    }

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

2 个答案:

答案 0 :(得分:2)

@setparam注释似乎是我正在寻找的,但是当我尝试分配超出范围的值时,Android Studio中不会引发任何lint警告。

这是我的新代码:

@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()
    }

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

enter image description here

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

enter image description here

当将Kotlin方法作为Java代码

调用时,也不会出现lint警告

enter image description here

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

答案 1 :(得分:0)

目前尚无法对此进行测试,但您是否尝试过像这样添加@set:

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