Как Android Studio узнает тип возврата универсального метода в режиме редактирования - PullRequest
0 голосов
/ 21 ноября 2018

В этом коде Kotlin для приложения для Android:

class PlantAdapter : ListAdapter<Plant, PlantAdapter.ViewHolder>(PlantDiffCallback()) {

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val plant = getItem(position)
        holder.apply {
            bind(createOnClickListener(plant.plantId), plant)
            itemView.tag = plant
        }
    }
}

В Android Studio, когда я набираю plant, после которого ставится точка, список полей и методов для завода перечисляется.Мне не ясно, как Android Studio знает это.Если я запускаю приложение и выполняю один шаг в методе getItem, метод getItem является универсальным методом, который ничего не знает о типе данных для завода.Он просто берет элемент из списка и возвращает его.Только после возврата переменная завода отображается как тип объекта.

Итак, как Android Studio узнает, что это за тип, когда приложение не запущено?

1 Ответ

0 голосов
/ 21 ноября 2018

ListAdapter параметризован с типом Plant в качестве типа модели презентации, который список получит в этом случае.Таким образом, если определение метода getItem в ListAdapter указано следующим образом:

protected T getItem(int position) {
    return mHelper.getItem(position);
}

, то после предоставления Plant в качестве аргумента типа этот метод будет «преобразован» (давайте пропустим удаление типа иметоды моста в этом примере) в это:

protected Plant getItem(int position) {
    return mHelper.getItem(position);
}

Kotlin поддерживает вывод типов при инициализации переменных.Это означает, что если тип переменной не был указан явно (например, val plant: Plant = ...), то тип будет выведен из типа результата выражения.Поскольку мы знаем, что после параметризации ListAdapter с помощью Plant метод getItem вернет нам экземпляр Plant, тогда этот тип будет выведен для объявленной переменной в val plant = getItem(position).

В Javaсоответствующая декларация будет выглядеть так:

Plant plant = this.getItem(position);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...