Historia pytania: Kotlin został pierwotnie zaprojektowany jako język z zwięzłą, ale ściśle typowaną składnią. W celu zwiększenia czytelności i zmniejszenia duplikacji kodu zrealizowano potężne wywnioskowanie typów.
Problem: Czasami deklaracja typu staje się zbędna, komplikując kod. Ale nadmierne uproszczenie typów prowadzi do trudności w odczycie i rozpowszechnianiu błędów, jeśli kompilator nie może wywnioskować typu.
Rozwiązanie: Inferring typów pozwala kompilatorowi automatycznie określić większość typów na podstawie inicjalizacji lub kontekstu. Ale ścisła typizacja wciąż kontroluje poprawność kodu.
Przykład kodu:
val name = "Kotlin" // String, typ wywnioskowany automatycznie var count = 5 // Int, typ wywnioskowany automatycznie val items = listOf(1, 2, 3) // List<Int> // Jawne wskazanie typu jest wymagane, jeśli wywnioskowanie jest niemożliwe val callback: (Int) -> Unit = { println(it) }
Kluczowe cechy:
Czy można pominąć wskazanie typu zwracanego w publicznej funkcji?
Nie, jeśli funkcja jest publiczna, kompilator wymaga jawnej deklaracji typu zwrotu dla stabilności interfejsów i wsparcia Java-interoperacji.
Przykład:
// Błąd! public fun compute(x: Int) = x * 2 // Wymaga jawnie: public fun compute(x: Int): Int = x * 2
Jaki typ ma val x = null?
Kompilator nie będzie mógł wywnioskować typu, ponieważ null nie ma typu bez kontekstu. Należy jawnie zadeklarować typ:
val x: String? = null
Czy inferring typów może działać dla złożonych typów generic przy łańcuchowym przetwarzaniu kolekcji?
Tak, ale jeśli typ nie może być jednoznacznie wywnioskowany (na przykład, map przekształca typy), czasami konieczne będzie jawne wskazanie typu zmiennej:
val values = listOf("1", "2").map { it.toInt() } // List<Int>, typ zostanie wywnioskowany
W projekcie wszystkie zmienne są zadeklarowane bez wskazania typu, co utrudnia nawigację i zrozumienie kodu dla innych deweloperów lub nowych pracowników.
Zalety:
Wady:
Wewnątrz funkcji typy zmiennych są wywnioskowane automatycznie, ale we wszystkich publicznych API zawsze jawnie wskazuje się typ zwracany i typy parametrów.
Zalety:
Wady: