Saya mencoba memahami tujuan reified
kata kunci, tampaknya itu memungkinkan kami untuk melakukan refleksi pada obat generik .
Namun, ketika saya tinggalkan itu berfungsi dengan baik. Adakah yang mau menjelaskan kapan ini membuat perbedaan nyata ?
generics
kotlin
kotlin-reified-type-parameters
hl3mukkel
sumber
sumber
Jawaban:
TL; DR: Apa yang
reified
baik untukDalam tubuh fungsi generik seperti
myGenericFun
, Anda tidak dapat mengakses tipeT
karena hanya tersedia pada waktu kompilasi tetapi terhapus saat runtime. Oleh karena itu, jika Anda ingin menggunakan tipe generik sebagai kelas normal di fungsi tubuh Anda harus secara eksplisit lulus kelas sebagai parameter seperti yang ditunjukkan padamyGenericFun
.Jika Anda membuat
inline
fungsi dengan reifiedT
, tipeT
dapat diakses bahkan saat runtime dan dengan demikian Anda tidak perlu meneruskannyaClass<T>
. Anda dapat bekerja denganT
seolah-olah itu adalah kelas normal, misalnya Anda mungkin ingin memeriksa apakah suatu variabel adalah contoh dariT
yang Anda dapat dengan mudah melakukan itu:myVar is T
.Seperti
inline
fungsi denganreified
tipeT
penampilan sebagai berikut:Bagaimana cara
reified
kerjanyaAnda hanya dapat menggunakan
reified
dalam kombinasi dengan suatuinline
fungsi . Fungsi seperti itu membuat compiler menyalin bytecode fungsi ke setiap tempat di mana fungsi tersebut digunakan (fungsi tersebut sedang "digarisbawahi"). Ketika Anda memanggil fungsi inline dengan tipe reified, kompiler mengetahui tipe aktual yang digunakan sebagai argumen tipe dan memodifikasi bytecode yang dihasilkan untuk menggunakan kelas terkait secara langsung. Oleh karena itu panggilan sepertimyVar is T
menjadimyVar is String
(jika argumen tipeString
) di bytecode dan saat runtime.Contoh
Mari kita lihat contoh yang menunjukkan betapa bermanfaatnya
reified
hal itu. Kami ingin membuat fungsi ekstensi untukString
dipanggiltoKotlinObject
yang mencoba untuk mengkonversi string JSON ke objek Kotlin biasa dengan tipe yang ditentukan oleh tipe generik fungsiT
. Kita dapat menggunakancom.fasterxml.jackson.module.kotlin
ini dan pendekatan pertama adalah sebagai berikut:a) Pendekatan pertama tanpa tipe reified
The
readValue
Metode mengambil jenis yang seharusnya untuk menguraiJsonObject
ke. Jika kita mencoba untuk mendapatkanClass
parameter tipeT
, kompiler mengeluh: "Tidak dapat menggunakan 'T' sebagai parameter tipe reified. Gunakan kelas sebagai gantinya."b) Penanganan masalah dengan
Class
parameter eksplisitSebagai solusinya,
Class
dariT
dapat dibuat parameter metode, yang kemudian digunakan sebagai argumen untukreadValue
. Ini berfungsi dan merupakan pola umum dalam kode Java generik. Itu bisa disebut sebagai berikut:c) Cara Kotlin:
reified
Menggunakan
inline
fungsi denganreified
parameter tipeT
memungkinkan untuk mengimplementasikan fungsi secara berbeda:Tidak perlu untuk mengambil
Class
dariT
tambahan,T
dapat digunakan sebagai olah itu adalah kelas biasa. Untuk klien, kode ini terlihat seperti ini:Catatan Penting: Bekerja dengan Java
Fungsi sebaris dengan
reified
tipe tidak dapat dipanggil dari kode Java .sumber
SEDERHANA
* Reified adalah untuk memberikan izin untuk digunakan pada waktu kompilasi (untuk mengakses fungsi T inside de)
misalnya:
menggunakan like:
sumber