Satu tanda seru di Kotlin

152

Apa arti satu tanda seru di Kotlin? Saya telah melihatnya beberapa kali terutama saat menggunakan Java API. Tetapi saya tidak dapat menemukannya di dokumentasi maupun di StackOverflow.

Mibac
sumber

Jawaban:

163

Mereka disebut tipe platform dan itu berarti Kotlin tidak tahu apakah nilai itu bisa atau tidak nulldan terserah Anda untuk memutuskan apakah itu nullable atau tidak.

Singkatnya, masalahnya adalah bahwa referensi apa pun yang datang dari Java mungkin null, dan Kotlin, karena desainnya aman-null, memaksa pengguna untuk memeriksa setiap nilai Java secara null, atau menggunakan panggilan aman ( ?.) atau pernyataan bukan-null ( !!). Itu adalah fitur yang sangat berguna di dunia Kotlin murni, cenderung berubah menjadi bencana ketika Anda harus menggunakannya terlalu sering di pengaturan Kotlin / Java.

Inilah sebabnya kami mengambil pendekatan radikal dan membuat sistem tipe Kotlin lebih santai dalam hal interop Java: sekarang referensi yang berasal dari Java memiliki tipe yang ditandai secara khusus - Blog Kotlin

Mibac
sumber
2
Itu semua bagus dikatakan dan dilakukan. Namun, saya hanya merasa tidak enak menyebutnyaplatform types
JaydeepW
66

Ini adalah notasi untuk jenis platform :

T!berarti " Tatau T?"

voddan
sumber
Mengapa tidak Tberarti " T!atau T?"
Arst
T! berarti non-nullable, T? Berarti nullable. Mengapa Kotlin tidak melakukan itu ...
Arst
4
Karena default terbaik adalah "non-nullable" untuk alasan yang jelas, dan ini adalah desain yang bagus untuk default menjadi tanda tangan tipe terpendek. Jadi Tdibuat "tidak dapat dibatalkan", dan sisanya lebih atau kurang sewenang
voddan
17

Jenis Platform

Nama jenis atau nama kelas yang diakhiri dengan tanda seru tunggal !disebut jenis platform di Kotlin. Anda menemukannya saat Anda bekerja di Kotlin dengan kode Java lama yang tidak berisi informasi nullability.

Contoh:

Informasi Nullable: Jenis Nullable

@Nullable Stringdi Jawa dianggap sebagai String?Kotlin.

Informasi Non-null: Jenis Non-null

@NotNull Stringdi Jawa dianggap sebagai StringKotlin.

Tidak Ada Informasi: Jenis Platform

String tanpa anotasi di Jawa dianggap sebagai String! Kotlin.


Bagaimana cara menangani Jenis Platform?

Anda dapat bekerja dengan jenis platform baik sebagai nullable atau non-null. Kompiler akan memungkinkan Anda memanggil semua metode pada tipe ini. Tanggung jawab Anda adalah bagaimana menggunakannya. Jika Anda tahu bahwa nilainya bisa nol, Anda harus membandingkannya dengan null sebelum Anda memanggil metode padanya. Jika Anda tahu itu bukan null, Anda dapat menggunakannya secara langsung tetapi seperti di Java, Anda akan mendapatkan pengecualian jika asumsi Anda tentang nullability salah.

Perhatikan bahwa Anda tidak dapat mendeklarasikan jenis platform dalam kode Kotlin, karena hanya berasal dari kode Java.


Jenis Warisan dan Platform

Saat mengganti metode Java dalam kode Kotlin, Anda memiliki opsi untuk mendeklarasikan parameter dan mengembalikan tipe sebagai nullable atau non-null. Anda harus memilih ini dengan bijak, karena jika Anda memutuskan untuk membuat parameter menjadi non-null, compiler Kotlin menghasilkan pernyataan non-null untuk parameter bukan null ini. Dan ketika lain kali Anda mengakses kode Kotlin ini kembali dari Java dan Anda meneruskan nilai null, Anda akan mendapatkan pengecualian.

Harapan yang membantu menghilangkan semua keraguan Anda tentang Jenis Platform.

Yogesh Umesh Vaity
sumber
13

Tipe yang dinotasikan !disebut tipe platform , yang merupakan tipe yang berasal dari Java dan kemungkinan besar bisa null. Itulah yang disimpulkan oleh kompilator Kotlin secara default saat memanggil Java (untuk kasus paling dasar, metode Java dapat diberi anotasi untuk menyiasatinya). Anda harus menangani tipe platform sebagai tipe nullable , kecuali Anda tahu pasti bahwa API tertentu tidak akan pernah kembali null. Kompilator memungkinkan tipe platform untuk ditugaskan ke variabel dari tipe nullable dan non-null.

Notasi untuk Jenis Platform

[...]

T!berarti " T or T?" [...]

Anda bisa menyebut jenis platform sebagai "jenis nullability yang tidak diketahui ". Yang juga penting untuk diketahui adalah Anda tidak dapat menggunakan tipe bertanda seru untuk tipe Anda sendiri, ini bukan bagian dari sintaks Kotlin, ini hanya notasi .

s1m0nw1
sumber
Frasa seperti 'kemungkinan besar' tidak membantu
Ewan
3

Saya telah melihatnya beberapa kali terutama saat menggunakan Java API

Seperti yang disebutkan oleh s1m0nw1, T!artinya T or T?. Pertanyaan selanjutnya adalah: apa itu T?? Ini didokumentasikan dengan baik di https://kotlinlang.org/docs/reference/null-safety.html . Kotlin tidak mengizinkan elemen tertentu null, misalnya String, tidak seperti Java

Untuk mengizinkan null, kita dapat mendeklarasikan variabel sebagai string nullable, String tertulis ?:

var b: String? = "abc"
b = null // ok

[...]

b?.length 

Ini mengembalikan b.length jika b bukan null, dan null sebaliknya. Jenis ekspresi ini adalah Int?.

serv-inc
sumber
0

Kutipan dari Jenis Platform di Kotlin :

Selain secara eksplisit menentukan jenis sebagai opsional (misalnya Person?), Kotlin memberi kita binatang lain, disebut Platform Type, ditentukan dengan meletakkan satu tanda seru sebagai gantinya (misalnya Person!). Konsep ini dibuat untuk alasan kompatibilitas, saat mengakses kode dari platform yang tidak aman seperti Java. Hal ini sering terjadi ketika menggunakan pustaka Java, banyak metode kembali SomeType!, karena compiler Kotlin tidak dapat menyimpulkan apakah hasilnya nullable atau tidak.

Sebagai contoh:

(Mutable)Collection<T>! 

Hanya berarti sebagai berikut: " Kumpulan Java dari T mungkin bisa berubah atau tidak, bisa jadi null atau tidak ".

Semoga ini membantu.

Andy Fedoroff
sumber