Sejak Scala 2.7.2 ada sesuatu yang disebut Manifest
yang merupakan solusi untuk penghapusan tipe Java. Tetapi bagaimana cara Manifest
kerjanya secara tepat dan mengapa / kapan Anda perlu menggunakannya?
Posting blog Manifests: Reified Types oleh Jorge Ortiz menjelaskan beberapa di antaranya, tetapi tidak menjelaskan bagaimana menggunakannya bersama dengan batas konteks .
Juga, apa ClassManifest
, dengan apa bedanya Manifest
?
Saya memiliki beberapa kode (bagian dari program yang lebih besar, tidak dapat dengan mudah memasukkannya di sini) yang memiliki beberapa peringatan terkait dengan jenis penghapusan; Saya kira saya bisa menyelesaikan ini dengan menggunakan manifes, tapi saya tidak yakin bagaimana caranya.
Jawaban:
Kompiler mengetahui lebih banyak informasi tentang tipe daripada yang dapat dengan mudah direpresentasikan oleh runtime JVM. Manifest adalah cara bagi kompiler untuk mengirim pesan antar-dimensi ke kode pada saat runtime tentang jenis informasi yang hilang.
Ini mirip dengan bagaimana orang Kleptonia meninggalkan pesan yang disandikan dalam catatan fosil dan "sampah" DNA manusia. Karena keterbatasan kecepatan cahaya dan bidang resonansi gravitasi, mereka tidak dapat berkomunikasi secara langsung. Tetapi, jika Anda tahu cara menyesuaikan sinyal mereka, Anda dapat mengambil manfaat dengan cara yang tidak dapat Anda bayangkan, dari memutuskan apa yang akan dimakan untuk makan siang atau nomor lotre mana yang akan dimainkan.
Tidak jelas apakah Manifest akan menguntungkan kesalahan yang Anda lihat tanpa mengetahui lebih detail.
Salah satu penggunaan Manifest yang umum adalah membuat kode Anda berperilaku berbeda berdasarkan pada jenis statis koleksi. Misalnya, bagaimana jika Anda ingin memperlakukan Daftar [String] berbeda dari jenis Daftar lainnya:
Solusi berbasis refleksi untuk ini mungkin akan melibatkan memeriksa setiap elemen daftar.
Batas konteks tampaknya paling cocok untuk menggunakan tipe-kelas dalam scala, dan dijelaskan dengan baik di sini oleh Debasish Ghosh: http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
Batas konteks juga bisa membuat metode tanda tangan lebih mudah dibaca. Misalnya, fungsi di atas dapat ditulis ulang menggunakan batas konteks seperti:
sumber
Bukan jawaban yang lengkap, tetapi mengenai perbedaan antara
Manifest
danClassManifest
, Anda dapat menemukan contoh di makalah Scala 2.8Array
:Contoh:
(Lihat pertanyaan SO untuk ilustrasi )
sumber
Manifest dimaksudkan untuk memverifikasi tipe generik yang dapat dihapus tipe untuk dijalankan di JVM (yang tidak mendukung obat generik). Namun, mereka memiliki beberapa masalah serius: mereka terlalu sederhana, dan tidak dapat sepenuhnya mendukung sistem tipe Scala. Mereka kemudian ditinggalkan dalam Scala 2.10, dan diganti dengan
TypeTag
s (yang pada dasarnya apa yang digunakan kompilator Scala sendiri untuk mewakili tipe, dan karenanya sepenuhnya mendukung tipe Scala). Untuk detail lebih lanjut tentang perbedaannya, lihat:Dengan kata lain
Sebelum 2013-01-04, ketika Scala 2.10 dirilis .
sumber
Mari kita habiskan juga
manifest
dalamscala
sumber (Manifest.scala
), kita melihat:Jadi berkaitan dengan kode contoh berikut:
kita dapat melihat bahwa
manifest
function
pencarian implisitm: Manifest[T]
yang memuaskantype parameter
Anda berikan dalam contoh kode kami itumanifest[String]
. Jadi, ketika Anda memanggil sesuatu seperti:Anda memeriksa apakah arus
implicit m
yang Anda tetapkan dalam fungsi Anda bertipemanifest[String]
dan karenamanifest
merupakan fungsi tipe,manifest[T]
ia akan mencari yang spesifikmanifest[String]
dan akan menemukan jika ada yang tersirat.sumber