Kotlin'de tek ünlem işareti


141

Kotlin'de tek bir ünlem işareti ne anlama geliyor? Özellikle Java API'lerini kullanırken birkaç kez gördüm. Ancak bunu belgelerde veya StackOverflow'da bulamadım.

Yanıtlar:


155

Bunlara platform türleri denir ve Kotlin'in bu değerin olup olmadığını bilmediği anlamına gelir nullve 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


2
Hepsi iyi dedi ve bitti. Ancak, ben sadece arama iyi hissediyorumplatform types
JaydeepW

61

Platform türleri için gösterim :

T!" Tveya T?" anlamına gelir


Neden T" T!veya T?" anlamına gelmez
Arst

T! boş bırakılamaz, T? nullable anlamına gelir. Kotlin neden bunu yapmıyor ...
Arst

4
En iyi varsayılan, açık nedenlerle "geçersiz kılınamaz" olduğundan ve varsayılanın en kısa tür imzası olması iyi bir tasarımdır. Böylece T"
hükümsüz

13

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.nullnull

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 .


'Büyük olasılıkla' gibi ifadeler yardımcı olmuyor
Ewan

10

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:

Sıfırlanabilir Bilgi: Sıfırlanabilir Tür

@Nullable StringJava'da String?Kotlin tarafından kabul edilir .

Boş Değer Bilgisi: Boş Değer Türü

@NotNull StringJava'da StringKotlin tarafından kabul edilir .

Bilgi Yok: Platform Türü

StringJava'da ek açıklama olmadan String!Kotlin tarafından kabul edilir .


Platform Türleriyle nasıl başa çıkılır?

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.


Kalıtım ve Platform Türleri

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.


3

Ö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 StringJava'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?.


0

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 Typeyerine tek bir ünlem işareti koyarak (örneğin Person!) 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öner SomeType!, çü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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.