首页 > 解决方案 > kotlin android中带有注释的抽象val

问题描述

我可以写:

@IdRes
abstract fun getHeaderId(): Int

在kotlin中用aval代替a ?fun它抱怨我在写时需要一个支持字段或委托:

@IdRes <-- errors
abstract val headerId: Int

在这种情况下,哪个是最惯用的?单线fun与支持字段或混乱(我不习惯支持字段,也许是抗变化,我从未真正使用过它们,所以我认为它们不愉快)

标签: androidkotlin

解决方案


由于 abstract valorvar只是一个没有支持字段的函数,因此无法通过注释对其进行注释,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 中通常等价于:

private int something

public int getSomething() {
    return something;
}

从示例中,很容易看出私有字段是所谓的属性的支持字段,您不能将它们作为抽象字段,所以这就是问题所在。


推荐阅读