Tipe IDE ( NetBeans ) saya memeriksa Collections
kode saya saat saya mengetik. Tetapi kemudian, mengapa saya harus melemparkan objek yang dikembalikan Object.clone()
? Itu baik saja. Tidak ada salahnya tidak busuk. Tapi tetap saja, saya tidak mengerti.
Apakah pengecekan tipe, tanpa casting, objek yang dikembalikan Object.clone()
tidak mungkin? The generik kerangka membuat saya berpikir IDE bisa memeriksa jenis referensi objek pada sisi kanan dari " = " mark tanpa casting sementara saya mengetik? Saya tidak mengerti.
addendum
Kasus penggunaan saya hanya karena saya memiliki Calendar
bidang pribadi , pubdate . Saya akan menulis:
Calendar getPubdate() {
return pubdate;
}
tapi ada risiko bahwa Invoker bisa memodifikasi saya pubdate , jadi saya kembali salinan:
Calendar getPubdate() {
return (Calendar) pubdate.clone();
}
Kemudian, saya bertanya-tanya mengapa saya harus memilih pubdate.clone()
. Metode signature memiliki tipe di sana. NetBeans harus bisa mengetahuinya. Dan NetBeans tampaknya melakukan sesuatu yang mirip dengan itu Collections
.
MyObject
dariclone()
daripadaObject
- ini menghilangkan seluruh masalah ini. Lebih lanjut dianjurkan untuk tidak pernah menggunakanclone()
(Item Java Efektif # 11).this.clone()
pada objek programmer, terutama pada malam Wed setelah rilis Tue. Maaf, tetapi saya harus menulis komentar ini. Mengapa IDE tidak pintar hanya memperbaiki semua bug untuk kami LOLJawaban:
Karena itu kembali
Object
.Object.clone
tidak generik.Jika obat generik telah ada ketika
clone
dirancang, mungkin akan terlihat seperti ini (menggunakan F-Bounded Polymorphism):Jika Java memiliki fitur MyType, mungkin akan terlihat seperti ini:
Tapi Generik tidak ada saat
Object.clone
dirancang, dan Java tidak memiliki MyTypes, jadi versi yang tidak amanObject.clone
adalah yang harus kita gunakan.sumber
original
?Ini bukan fitur dari IDE apa pun, tetapi dari definisi bahasa.
Sebuah IDE membantu Anda menggunakan bahasa pemrograman lebih efisien, itu tidak mengubah semantik bahasa itu. Itu berarti bahwa bantuan editor mungkin secara otomatis memasukkan gips ketika sudah jelas yang mana yang Anda inginkan, tetapi itu tidak bisa begitu saja melanggar aturan bahasa dan berpura-pura bahwa kode yang tidak dikompilasi valid.
Sunting Memang benar bahwa suatu IDE dapat membundel kompilernya sendiri, dan pada kenyataannya banyak yang melakukan hal itu, misalnya untuk pelaporan kesalahan yang lebih baik dengan lebih banyak informasi orang dalam ke dalam pohon parse parsial. Namun, itu akan menjadi ide yang sangat buruk untuk membiarkan kompiler internal ini menerapkan semantik bahasa yang berbeda dari SDK resmi, karena itu berarti bahwa kode yang berfungsi dalam pengembangan dapat secara misterius mulai gagal ketika dipasang di produksi - menghasilkan masalah yang menurut definisi tidak debuggable!
sumber
Ini karena tipe tanda tangan dari metode Object.clone. Tipe tanda tangan menyatakan bahwa metode akan mengembalikan objek tipe Objek.
Koleksi akan menggunakan tipe generik yang disebut untuk menggantikan jenis casting secara otomatis.
Jadi, jika Anda memiliki kode ini:
kompiler akan menambahkan gips untuk Anda di belakang layar, sehingga kodenya akan menjadi:
sumber
Untuk kelengkapan, sejak Java 5, tipe pengembalian kovarian diizinkan . Jadi, Anda dapat menulis yang berikut ini:
Dengan ini, kode berikut ini legal:
sumber