我可以写:
@IdRes
abstract fun getHeaderId(): Int
在Kotlin中使用val
而不是fun
吗?它抱怨我写时需要一个后备字段或委托:
@IdRes <-- errors
abstract val headerId: Int
在这种情况下哪个是最惯用的?带有fun
的单线或与支持字段混为一谈(我不习惯支持字段,也许是耐更改性,我从未真正使用过它们,所以我认为它们令人不快)
答案 0 :(得分:8)
由于抽象val或var只是没有后备字段的函数,因此无法通过IdRes
注释进行注释,但是有一种解决方法。您可以像这样使用它:
@get:IdRes
abstract val headerId: Int
编辑:
这为什么起作用?我们需要仔细检查IdRes
批注及其源代码:
@Documented
@Retention(CLASS)
@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE})
public @interface IdRes {
}
我们可以看到此注释可以用于方法,参数,字段和局部变量。当我们使用abstract val
时,它们都不是,因为它是抽象的,我们在Java中不能有抽象字段。在Java中,通常等效于asbtract val something: Int
的是:
private int something
public int getSomething() {
return something;
}
从示例中很容易看出,私有字段是属性的所谓后备字段,而您不能将它们抽象化,所以这就是问题所在。
答案 1 :(得分:1)
如@AtulGupta 评论中所述,@theKarlo 的回答不会强制子类传入 IdRes
。
因此,替代
@IdRes
abstract fun getHeaderId(): Int
和
@get:IdRes
abstract val headerId: Int
是将值传递给类本身的构造函数,这样可以避免后台字段问题。
例如:
abstract class SomeClass(@IdRes val idRes: Int)