Yanıtlar:
Bunlara platform türleri denir ve Kotlin'in bu değerin olup olmadığını bilmediği anlamına gelir null
ve null olup olmadığına karar vermek size bağlıdır.
Özetle, sorun Java'dan gelen herhangi bir referansın boş olması ve Kotlin'in tasarım gereği sıfırdan güvenli olması, kullanıcıyı her Java değerini null kontrol etmeye veya güvenli çağrılar (
?.
) veya null olmayan iddialar (!!
). Saf Kotlin dünyasındaki çok kullanışlı özellikler, Kotlin / Java ortamında çok sık kullanmanız gerektiğinde bir felakete dönüşme eğilimindedir.Bu yüzden radikal bir yaklaşım izledik ve Java interop söz konusu olduğunda Kotlin'in tip sistemini daha rahat hale getirdik: şimdi Java'dan gelen referanslar özel olarak işaretlenmiş tiplere sahip - Kotlin Blog
Platform türleri için gösterim :
T!
" T
veya T?
" anlamına gelir
T
" T!
veya T?
" anlamına gelmez
T
"
Notated a Type , Java'dan gelen ve bu nedenle büyük olasılıkla olabilen bir platform türü!
olarak adlandırılır . Java'yı çağırırken Kotlin derleyicisinin varsayılan olarak karşılaştığı şey budur (en temel durumlar için, Java yöntemlerine bu sorunu aşmak için açıklama eklenebilir ). Belirli API'nin asla geri dönmeyeceğini bilmediğiniz sürece, platform türlerini null olabilecek türler olarak ele almalısınız . Derleyici, platform türlerinin null ve null olmayan türlerin değişkenlerine atanmasına izin verir.null
null
Platform Türleri İçin Gösterim
[...]
T!
"T or T?
" [...] anlamına gelir
Platform türlerini " bilinmeyen nullabilite türleri " olarak adlandırabilirsiniz. Ayrıca bilmek önemlidir, ünlem işaretli türü kendi türleriniz için kullanamazsınız, Kotlin sözdiziminin bir parçası değildir, sadece bir gösterimdir .
Tek ünlem işaretiyle biten tür adlarına veya sınıf adlarına Kotlin'de Platform Türleri!
denir . Kotlin'de, nullabilite bilgisi içermeyen eski Java koduyla çalışırken bulabilirsiniz.
Örneğin:
@Nullable String
Java'da String?
Kotlin tarafından kabul edilir .
@NotNull String
Java'da String
Kotlin tarafından kabul edilir .
String
Java'da ek açıklama olmadan String!
Kotlin tarafından kabul edilir .
Platform türü ile null veya null olmayan olarak çalışabilirsiniz. Derleyici, bu türdeki tüm yöntemleri çağırmanıza izin verecektir. Bunları nasıl kullanacağınız sizin sorumluluğunuzdadır. Değerin null olabileceğini biliyorsanız, üzerinde yöntem çağırmadan önce değeri null ile karşılaştırmalısınız. Boş olmadığını biliyorsanız, doğrudan kullanabilirsiniz, ancak Java'da olduğu gibi, nullabilite ile ilgili varsayımınız yanlışsa istisna alırsınız.
Kotlin kodunda platform türlerini bildiremeyeceğinizi, sadece Java kodundan geldiğini unutmayın.
Kotlin kodunda Java yöntemlerini geçersiz kılarken, parametreleri ve döndürme türlerini boş veya boş olarak tanımlama seçeneğiniz vardır. Bunu akıllıca seçmelisiniz, çünkü parametreleri null değerine getirmeye karar verirseniz, Kotlin derleyicisi bu null olmayan parametreler için null olmayan iddialar üretir. Ve bir dahaki sefere bu Kotlin koduna Java'dan geri eriştiğinizde ve bir boş değer ilettiğinizde, istisna elde edersiniz.
Platform Türleri hakkındaki tüm şüphelerinizi gidermeye yardımcı olacağını umuyoruz.
Özellikle Java API'lerini kullanırken birkaç kez gördüm
S1m0nw1 tarafından belirtildiği gibi, T!
anlamına gelir T or T?
. Bir sonraki soru: nedir T?
? Bu, https://kotlinlang.org/docs/reference/null-safety.html adresinde güzel bir şekilde belgelenmiştir . Kotlin, belirli öğelerin null
, örneğin String
Java'nın aksine olmasına izin vermez
Null değerlerine izin vermek için, bir değişkeni dize? Dizesi olarak dize? Olarak yazabiliriz:
var b: String? = "abc" b = null // ok
[...]
b?.length
B boş değilse b.uzunluğu, aksi takdirde boştur. Bu ifadenin türü
Int?
.
Kotlin'deki Platform Türlerinden Alıntı :
Person?
Kotlin'i isteğe bağlı olarak açıkça belirtmenin yanı sıra (örneğin ), Kotlin bize,Platform Type
yerine tek bir ünlem işareti koyarak (örneğinPerson!
) belirtilen başka bir canavarı sunar . Bu kavram, Java gibi boş olmayan platformlardan koda erişirken uyumluluk nedenleriyle oluşturulmuştur. Çoğu zaman bir Java kütüphanesi kullanılırken, birçok yöntem geri dönerSomeType!
, çünkü Kotlin derleyicisi sonucun geçersiz olup olmadığı sonucunu çıkartamaz.
Örneğin:
(Mutable)Collection<T>!
Sadece şu anlama gelir: " T'nin Java koleksiyonu değiştirilebilir olabilir veya olmayabilir, geçersiz olabilir veya olmayabilir ".
Bu yardımcı olur umarım.
platform types