带有注释的抽象val在kotlin android中

Ada*_*dam 7 android kotlin

我可以写:

@IdRes
abstract fun getHeaderId(): Int
Run Code Online (Sandbox Code Playgroud)

val而不是funkotlin?它抱怨我写作时需要一个支持领域或代表:

@IdRes <-- errors
abstract val headerId: Int
Run Code Online (Sandbox Code Playgroud)

在这种情况下哪个是最惯用的?单线fun或带有背景场的混乱(我不习惯支持场,也许它是变化阻力,我从来没有真正使用它们所以我认为它们是不愉快的)

The*_*o95 13

由于抽象val或var只是一个没有后备字段的函数,因此无法通过注释进行val注释,但有一种解决方法.你可以像这样使用它:

@get:IdRes
abstract val headerId: Int
Run Code Online (Sandbox Code Playgroud)

编辑:

为什么会这样?我们需要更仔细地检查var注释及其源代码:

@Documented
@Retention(CLASS)
@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE})
public @interface IdRes {
}
Run Code Online (Sandbox Code Playgroud)

我们可以看到这个注释可以用在方法,参数,字段和局部变量上.当我们使用IdRes它时,它们都不是那些,因为它是抽象的,我们不能在Java中有抽象字段.通常IdRes在Java中相当于:

private int something

public int getSomething() {
    return something;
}
Run Code Online (Sandbox Code Playgroud)

从示例中可以很容易地看出私有字段是所谓的属性的支持字段,并且您不能将它们视为抽象,因此这就是问题所在.

  • 但是在这种情况下,使用抽象类的人可能会通过在抽象类的实现中编写 override `val headerId: Int = 5` 来绕过注释 (3认同)