Для чего при наследовании из RecyclerView.Adapter добавляется вложенный класс в угловых скобках?

Код из урока по Android Studio, но я хочу понять, что значит этот синтаксис в Kotlin <PlantAdapter.PlantHolder> - и для чего он используется В комментах , что я понял.

class PlantAdapter: RecyclerView.Adapter <PlantAdapter.PlantHolder> () {

    // PlantAdapter наследуется от вложенного класса RecyclerView.Adapter
    // Дальше в угловых скобках вложенный класс <PlantAdapter.PlantHolder> - который есть ниже

    class PlantHolder(item: View): RecyclerView.ViewHolder (item) {
    }
}

Я создал модель - этих классов и чтобы я не вводил в <> результат не менялся. Как будто там может быть любой тип данных. Хотя в уроке указывали , что нужно чтобы , именно, это было прописано <PlantAdapter.PlantHolder>

Ниже модель которую я сделал

// begin of hidden part
open class RecyclerView<T>() {
    fun printRecyclerView () {
        println("RecyclerView Parent print")
    }
}
// end of hidden part
class PlantAdapter (varPlantAdapter: Int): RecyclerView <PlantAdapter.PlantHolder2> () {

    class PlantHolder (int: Int, str : String) {
        val int = int
        fun printPlantHolder () {
            println("PlantHolder Inner child - $int")
        }
    }

    class PlantHolder2 (int: Int) {
        val int = int
        fun printPlantHolder2 () {
            println("PlantHolder2 Inner child - $int")
        }
    }
    // я этот класс создал, чтобы проверить поменяется ли что-то если указать его в <>
    // ничего не поменялось, ему ввобще все равно
}

class ExampleMainTwo () {
    fun exe () {
        val obj = PlantAdapter (0)
        obj.printRecyclerView() // RecyclerView Parent print

        val obj2 = PlantAdapter.PlantHolder (1, "Hello")
        obj2.printPlantHolder() // PlantHolder Inner child - 1
    }
}

Заранее спасибо за ответ


Ответы (1 шт):

Автор решения: woesss

В объявлении библиотечного адаптера указано не <T> как у вас, а
<VH : RecyclerView.ViewHolder?> - это значит, что типизировать свой наследник адаптера вы можете только наследником RecyclerView.ViewHolder, что не позволит вам даже пытаться использовать в качестве холдера неправильный тип. А конкретизация дженерика при наследовании - не позволит использовать даже другие наследники RecyclerView.ViewHolder. Всё это даёт типо-безопасность уже на этапе компиляции плюс синтаксический сахар - вам не нужно проверять тип и приводить к конкретному, все параметры и возврашаемые типы конкретизируются и проверяются компилятором.

→ Ссылка