注释类不会在Kotlin中将输入验证为枚举

时间:2018-05-15 07:55:13

标签: kotlin annotations

我想创建注释而不是枚举用于语句

@Retention(AnnotationRetention.SOURCE)
@IntDef(SELECT.toLong(), WEAR.toLong(), BAND.toLong())
annotation class CurrentState

companion object {
    const val SELECT = 0
    const val WEAR = 1
    const val BAND = 2
} 

private fun handleFragment(@CurrentState state:Int) {
    val fragment:Fragment =
    when(state){
        SELECT -> SelectDeviceFragment.newInstance()
        WEAR -> ConnectWatchFragment.newInstance()
        BAND -> SelectDeviceFragment.newInstance()
    }

根据我的理解,此代码应该阻止我执行以下代码:

handleFragment(5)

并且语句不应该要求我添加 else 语句,正如枚举所期望的那样 我做错了什么或误解了什么?

2 个答案:

答案 0 :(得分:0)

来自https://discuss.kotlinlang.org/t/intdef-and-stringdef-not-being-checked-at-compile-time/7029

  

此检查不是来自编译器,而是来自Android lint。正在努力使android lint语言独立,但如果我没弄错的话,你需要一个更新版本的Android Studio。

并且Android Studio 3.1 blog post提到了对Kotlin的lint检查作为一项功能(虽然它没有说明是否支持这种检查)。

答案 1 :(得分:0)

@IntDef注释是Android框架的一部分。编译器不知道此批注的任何特定语义,也无法使用它来检查when语句的详尽性。

此外,即使使用注释,您也可以致电handleFragment(5)。此类代码不会是编译器错误,只会报告为lint警告。