Saya ingin menulis fungsi yang mengembalikan setiap item di List
yang bukan item pertama atau terakhir (titik via). Fungsi tersebut mendapat generik List<*>
sebagai input. Hasil hanya boleh dikembalikan jika elemen daftar berjenis Waypoint
:
fun getViaPoints(list: List<*>): List<Waypoint>? {
list.forEach { if(it !is Waypoint ) return null }
val waypointList = list as? List<Waypoint> ?: return null
return waypointList.filter{ waypointList.indexOf(it) != 0 && waypointList.indexOf(it) != waypointList.lastIndex}
}
Saat mentransmisikan List<*>
ke List<Waypoint>
, saya mendapatkan peringatan:
Cast yang tidak dicentang: kotlin.collections.List ke kotlin.colletions.List
Saya tidak tahu cara untuk menerapkannya sebaliknya. Apa cara yang benar untuk mengimplementasikan fungsi ini tanpa peringatan ini?
filterIsInstance
dan daftar asli berisi elemen dari jenis yang berbeda, kode Anda akan secara diam-diam memfilternya. Terkadang ini yang Anda inginkan tetapi terkadang Anda mungkin lebih sukaIllegalStateException
dilempar atau serupa. Jika nanti kasusnya terjadi maka Anda dapat membuat metode Anda sendiri untuk memeriksa dan kemudianinline fun <reified R> Iterable<*>.mapAsInstance() = map { it.apply { check(this is R) } as R }
.apply
tidak mengembalikan nilai kembali lambda, itu mengembalikan objek terima. Anda mungkin ingin menggunakan.takeIf
jika Anda ingin opsi mengembalikan null.Untuk meningkatkan jawaban @ hotkey, inilah solusi saya:
Ini memberi Anda
List<Waypoint>
jika semua item dapat dicor, nol jika tidak.sumber
Dalam kasus kelas generik, cetakan tidak dapat diperiksa karena informasi jenis dihapus saat runtime. Tetapi Anda memeriksa bahwa semua objek dalam daftar adalah
Waypoint
s sehingga Anda bisa menekan peringatan dengan@Suppress("UNCHECKED_CAST")
.Untuk menghindari peringatan seperti itu, Anda harus meneruskan
List
objek yang dapat dikonversiWaypoint
. Saat Anda menggunakan*
tetapi mencoba mengakses daftar ini sebagai daftar yang diketik, Anda akan selalu membutuhkan pemeran dan pemeran ini tidak akan dicentang.sumber
Saya membuat sedikit variasi pada jawaban @hotkey ketika digunakan untuk memeriksa objek Serializable to List:
sumber
Cannot access 'Serializable': it is internal in 'kotlin.io'
Dari pada
Saya suka melakukan
Tidak yakin seberapa performanya, tapi tidak ada peringatan setidaknya.
sumber