[英]Abstract val with annotation in kotlin android
我可以写:
@IdRes
abstract fun getHeaderId(): Int
在 kotlin 中使用val
而不是fun
? 它抱怨我在写时需要一个支持字段或委托:
@IdRes <-- errors
abstract val headerId: Int
在这种情况下,哪个是最惯用的? 一个fun
或带有支持字段的混乱(我不习惯支持字段,也许是抗变化性,我从未真正使用过它们,所以我认为它们令人不快)
由于抽象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 中我们不能有抽象字段。 通常相当于abstract val something: Int
Java 中的abstract val something: Int
是:
private int something
public int getSomething() {
return something;
}
从示例中,很容易看出私有字段就是所谓的属性的支持字段,您不能将它们抽象为抽象字段,这就是问题所在。
正如@AtulGupta 评论中提到的,@theKarlo 的回答不会强制子类传入IdRes
。
因此,替代
@IdRes
abstract fun getHeaderId(): Int
和
@get:IdRes
abstract val headerId: Int
是将值传递给类本身的构造函数,这样就可以避免后备字段问题。
例如:
abstract class SomeClass(@IdRes val idRes: Int)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.