我想创建注释而不是枚举用于时语句
@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 语句,正如枚举所期望的那样 我做错了什么或误解了什么?
答案 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警告。