Ada opsi keempat selain yang ada di jawaban mfulton26.
Dengan menggunakan ?.
operator dimungkinkan untuk memanggil metode serta bidang tanpa berurusan dengan let
atau menggunakan variabel lokal.
Beberapa kode untuk konteks:
var factory: ServerSocketFactory = SSLServerSocketFactory.getDefault();
socket = factory.createServerSocket(port)
socket.close()//smartcast impossible
socket?.close()//Smartcast possible. And works when called
Ini bekerja dengan metode, bidang dan semua hal lain yang saya coba untuk membuatnya berfungsi.
Jadi untuk menyelesaikan masalah, alih-alih harus menggunakan gips manual atau menggunakan variabel lokal, Anda dapat menggunakan ?.
untuk memanggil metode.
Untuk referensi, ini diuji di Kotlin 1.1.4-3
, tetapi juga diuji di 1.1.51
dan 1.1.60
. Tidak ada jaminan itu berfungsi pada versi lain, itu bisa menjadi fitur baru.
Menggunakan ?.
operator tidak dapat digunakan dalam kasus Anda karena variabel yang diteruskan itulah masalahnya. Operator Elvis dapat digunakan sebagai alternatif, dan mungkin salah satu yang membutuhkan jumlah kode paling sedikit. Alih-alih menggunakan continue
sekalipun, return
bisa juga digunakan.
Menggunakan casting manual juga bisa menjadi pilihan, tetapi ini bukan nol aman:
queue.add(left as Node);
Berarti jika kiri telah berubah pada utas yang berbeda, program akan macet.