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