Kotlin, başlangıçta Java'ya güvenli ve özet bir alternatif olarak tasarlandı. Güçlü yönlerinden biri, tür güvenliğinden ödün vermeden daha az sözel kod yazmaya olanak tanıyan gelişmiş bir tip çıkarım mekanizmasıdır. Tip çıkarımı, işlevsel dillerden (örneğin, Scala ve Haskell) ve modern statik tipli dillerin tasarım trendlerinden esinlenilmiştir.
Java ve diğer statik dillerde tiplerin açıkça belirtilmesi gerekmektedir, bu da kodda fazladan bir yük oluşturur. Ancak, açık tiplerin olmaması kodun anlaşılmasını zorlaştırabilir ve tip çıkarımı düzgün çalışmadığında belirsiz hatalara yol açabilir.
Kotlin'de derleyici sıklıkla bir değişkenin veya ifadenin tipini bağlamdan bağımsız olarak belirleyebilir. Bu, değişkenler, işlevlerin dönen değerleri ve lambda ifadeleri içinde çalışır. Ancak, derleyicinin açıkça tip belirtmesini gerektiren durumlar vardır; örneğin, bir sınıf içinde dönüş değeri olmayan bir işlevin tanımında ('fun doSomething()') veya ifadelerin belirsiz olduğu durumlarda.
Örnek kod:
val a = 42 // Int val s = "hello" // String fun sum(x: Int, y: Int) = x + y // dönüş tipi Int otomatik olarak çıkarılır val list = listOf(1, 2, 3) // List<Int> // Eğer değer çıkarılamıyorsa, açıkça tip belirtmek gerekir val emptyList: List<String> = emptyList() // aksi takdirde List<Nothing> olacaktır
Anahtar özellikler:
Sınıf özellikleri için iki nokta üst üste işaretinden sonra tipin neden her zaman atlanamayacağını?
İlan yerinde başlatılmayan özellikler (örneğin, getter aracılığıyla veya init bloğunda) için derleyici tip belirleyemez çünkü başlatıcıyı göremez.
class User { val fullName: String // Tip belirtilmesi zorunludur, aksi takdirde hata oluşur get() = "name" }
Eğer emptyList() kullanılırsa, değişkenin tipi ne olur?
Tip List<Nothing> olarak belirlenir, bu da sonucu neredeyse işe yaramaz hale getirir.
val list = emptyList() // List<Nothing>
Tip çıkarımının işlev parametreleriyle çalışmadığı ne zaman?
Bir işlevin imzasında, parametre tipleri her zaman açıkça belirtilmelidir, aksi takdirde derleyici hata verir.
// Hata: // fun foo(x) = x * 2 // Doğru: fun foo(x: Int) = x * 2
Geliştirici, tip belirlemeden API işlevinden döndürmek için emptyList() kullanır. Sonuç olarak alınan tip List<Nothing> oldu ve bu, API ile çalışmada sorun yaratır.
Artıları:
Geliştirici, boş koleksiyonlarla çalışırken ve okunabilirliği artıran yerlerde her zaman açıkça tip belirtir, diğer durumlarda derleyicinin tip çıkarımına güvenir.
Artıları: