10

我一直在试图找出如何申请@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 。是否可以将此注释应用于设置器,以便出现适当的 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 参数。

4

2 回答 2

5

@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 范围之外的值

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

于 2018-05-02T10:54:20.867 回答
0

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

@set:IntRange(from = 1)
@get:IntRange(from = 1)
    var `val`: Int = 0
于 2018-05-02T07:41:46.330 回答