Как работает эта версия findViewById ()? - PullRequest
0 голосов
/ 27 февраля 2019

Эта версия из View.findViewById() возвращает наиболее конкретный конкретный подтип View:

protected <T extends View> T findViewById(@IdRes int id) {
    return (T) getRootView().findViewById(id);
}

Как это работает? В частности, как тип может быть выведен во время компиляции, когда id ищется во время выполнения?Связано ли это с аннотацией?

Это отличается от вопросов с похожими названиями, которые касаются использования из findViewById():

Я хотел бы знать , почему это работает.

1 Ответ

0 голосов
/ 27 февраля 2019

Это не может быть выведено.Он использует приведение - return (T).Вызывающая сторона отвечает за то, чтобы тип T соответствовал типу отображаемого вида.Если они ошибаются, операция завершится с ClassCastException.

типом, который может быть указан явно, т. Е.

this.<TextView>findViewById(R.id.someTextView)

(извините, если у меня есть этот синтаксиснеправильно - я в основном имею дело с Kotlin)

или это может быть выведено из пункта назначения:

TextView foundView = findViewById(R.id.someTextView)

, но в любом случае ответственность лежит на звонящем.

Инструментарий Android может выполнять дополнительную работу по перекрестной ссылке на компоновку XML с кодом и создавать предупреждения или сбои в вашей среде IDE, но это уровень времени компиляции поверх того, что Java выполняет во время выполнения.

Он не имеет ничего общего с аннотацией @IdRes, которая должна утверждать - опять же во время компиляции - что параметр id является ссылкой на идентификатор некоторой сущности на основе XML, а не просто любым целочисленным значением.

...