Para pemainnya adalah teknis memungkinkan. Tidak dapat dengan mudah dibuktikan oleh javac bahwa tidak demikian halnya dengan Anda dan JLS benar-benar mendefinisikan ini sebagai program Java yang valid, sehingga menandai kesalahan akan salah.
Ini karena List
antarmuka. Jadi Anda bisa memiliki subclass dari Date
yang benar-benar mengimplementasikan yang List
disamarkan seperti di List
sini - dan kemudian casting itu Date
akan baik-baik saja. Sebagai contoh:
public class SneakyListDate extends Date implements List<Foo> {
...
}
Lalu:
List<Foo> list = new SneakyListDate();
Date date = (Date) list; // This one is valid, compiles and runs just fine
Mendeteksi skenario semacam itu mungkin tidak selalu memungkinkan, karena akan memerlukan informasi runtime jika instance berasal dari, misalnya, suatu metode. Dan bahkan jika, itu akan membutuhkan lebih banyak upaya untuk kompiler. Kompilator hanya mencegah gips yang benar-benar tidak mungkin karena tidak ada cara bagi pohon kelas untuk mencocokkan sama sekali. Yang tidak terjadi di sini, seperti yang terlihat.
Perhatikan bahwa JLS mengharuskan kode Anda menjadi program Java yang valid. Dalam 5.1.6.1. Konversi Referensi Sempit yang Diperbolehkan dikatakan:
Konversi penyempitan referensi ada dari tipe S
referensi ke tipe referensi T
jika semua hal berikut ini benar :
- [...]
- Salah satu dari kasus berikut ini berlaku :
- [...]
S
adalah tipe antarmuka, T
adalah tipe kelas, dan T
tidak menyebutkan nama final
kelas.
Jadi, bahkan jika kompiler dapat mengetahui bahwa case Anda sebenarnya tidak mungkin terbukti, ia tidak diperbolehkan menandai kesalahan karena JLS mendefinisikannya sebagai program Java yang valid.
Itu hanya akan diizinkan untuk menunjukkan peringatan.
List
sini.Date d = (Date) new Object();