Как работает эта версия findViewById()?

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

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

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

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

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

findViewById() возвращает View Object. Затем этот Object преобразуется в то, что определено как T. Это то, что вы имели ввиду?
TheWanderer 26.02.2019 22:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
1
193
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

(извините за синтаксис, если я ошибаюсь - сейчас я в основном работаю с Котлином)

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

TextView foundView = findViewById(R.id.someTextView)

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

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

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

Спасибо! Чего мне не хватало, так это того, что его можно было вывести из пункта назначения.

Ellen Spertus 26.02.2019 23:14

Другие вопросы по теме