Абстрактный вал с аннотацией в kotlin android - PullRequest
0 голосов
/ 19 декабря 2018

Могу ли я написать:

@IdRes
abstract fun getHeaderId(): Int

С val вместо fun в котлине?Он жалуется, что мне нужно поле поддержки или делегат, когда я пишу:

@IdRes <-- errors
abstract val headerId: Int

Что является наиболее идиоматическим в этом случае?Однострочник с fun или возня с полем поддержки (я не привык к резервированию полей, может быть, это сопротивление изменениям, я никогда не использовал их, поэтому я думаю, что они неприятны)

1 Ответ

0 голосов
/ 19 декабря 2018

Поскольку абстрактный 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:

private int something

public int getSomething() {
    return something;
}

Из примера легко увидеть, что приватное поле - это то, что называется резервным полем свойства, и вы не можете иметь такие абстрактные поля, чтобыбыла проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...