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.
Jawaban:
Mereka disebut tipe platform dan itu berarti Kotlin tidak tahu apakah nilai itu bisa atau tidak null
dan 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
Ini adalah notasi untuk jenis platform :
T!
berarti " T
atau T?
"
T
berarti " T!
atau T?
"
T
dibuat "tidak dapat dibatalkan", dan sisanya lebih atau kurang sewenang
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 String
di Jawa dianggap sebagai String?
Kotlin.
Informasi Non-null: Jenis Non-null
@NotNull String
di Jawa dianggap sebagai String
Kotlin.
Tidak Ada Informasi: Jenis Platform
String
tanpa anotasi di Jawa dianggap sebagai String!
Kotlin.
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.
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.
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.
[...]
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 .
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?
.
Kutipan dari Jenis Platform di Kotlin :
Selain secara eksplisit menentukan jenis sebagai opsional (misalnya
Person?
), Kotlin memberi kita binatang lain, disebutPlatform Type
, ditentukan dengan meletakkan satu tanda seru sebagai gantinya (misalnyaPerson!
). 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 kembaliSomeType!
, 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.
platform types