Kotlin ma własne kolekcje i strumienie.
Istotną wadą Kotlina może być za to brak tak rozbudowanej listy kolekcji w związku z czym podczas rekrutacji bez sensu jest pytać "czym się różni LinkedList od ArrayList" i pozostaje jedynie pytanie o różnice pomiędzy klasą abstrakcyjną a interfejsem, ale to akurat istotne jest jedynie dla seniorów.
Kotlin rozszerza standardowe kolekcje z Javy. To Scala ma własne niekompatybilne z Javą kolekcje i trzeba używać wrapperów, by móc np przenieść Scalową Listę do metody oczekującej Javowej Listy.
Przykłady kolekcji w Kotlinie:
Możesz sobie spokojnie użyć także innych kolekcji z Javy w Kotlinie, bez wrapperów i bez konwersji. Na przykład:
fun main(args: Array<String>) {
val kolekcja: MutableList<String> = java.util.LinkedList<String>()
kolekcja.add("Hello")
kolekcja.add("World")
println(kolekcja)
}
https://www.ideone.com/NgVvXY
generyki w Kotlinie działają inaczej niż w Javie
Różnica sprowadza się głównie do use-site variance vs declaration-site variance: https://stackoverflow.com/q/4231305 Declaration-site variance jest między innymi w: C#, Kotlinie, Scali. Nie w Javie.
Niektórzy myślą, że Kotlin rozwiązuje problem wymazywania typów poprzez słówko kluczowe reified
pokazane tutaj: https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters
Prawda jest taka, że Kotlin wcale magicznie nie odzyskuje wymazanych typów. Po prostu słówko kluczowe reified
wymaga także słówka kluczowego inline
, a więc ciało metody jest wklejone w miejsce wywołania na etapie kompilacji i także na etapie kompilacji kompilator statycznie oblicza którą klasę tworzymy. To jest coś zupełnie innego niż w C#, aczkolwiek samo podniecenie w związku z kompilującym się kodem typu new T()
(w metodzie generycznej) jest takie samo.