Collection<T>
- это универсальный интерфейс.Общие классы позволяют программистам указывать с помощью одного объявления класса или интерфейса набор связанных типов.Java 1.5 и Kotlin поставлялись с Generics, и все интерфейсы и реализации коллекций активно их используют.
Обобщения позволяют нам указать тип Object
, который может содержать коллекция, поэтому, если вы попытаетесь добавить какой-либо элемент другого типа, она выдаст ошибка времени компиляции .Обобщения обеспечивают безопасность типов во время компиляции, что позволяет программистам перехватывать недопустимые типы во время компиляции.Это означает, что если вы напишите так, компилятор выдаст ошибку:
val collection: MutableCollection<Int> = mutableListOf()
collection.add("some string") // compile time error saying "Type mismatch"
Это позволит избежать ClassCastException
во время выполнения, потому что вы получите ошибку при компиляции ( "Несоответствие типов" ),Кроме того, Generics делает код чистым, так как нам не нужно использовать приведение и оператор instanceof
в Java или оператор as
в Kotlin .Это означает, что если мы указываем явный тип, например MutableCollection<String>
, нам не нужно приводить его при получении из коллекции:
val collection: MutableCollection<String> = mutableListOf()
collection.add("Some string")
val data: String = collection.elementAt(0) // don't need to cast to String
Если мы используем MutableCollection<Any>
, нам нужны явные данные приведения:
val collection: MutableCollection<Any> = mutableListOf()
collection.add("Some string")
val data: String? = collection.elementAt(0) as? String // explicitly casting using `as` operator
Это также дает преимущество во время выполнения, поскольку инструкции байт-кода, которые выполняют проверку типов, не генерируются.