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 Listantarmuka. Jadi Anda bisa memiliki subclass dari Dateyang benar-benar mengimplementasikan yang Listdisamarkan seperti di Listsini - dan kemudian casting itu Dateakan 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 Sreferensi ke tipe referensi Tjika semua hal berikut ini benar :
- [...]
- Salah satu dari kasus berikut ini berlaku :
- [...]
Sadalah tipe antarmuka, Tadalah tipe kelas, dan Ttidak menyebutkan nama finalkelas.
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.
Listsini.Date d = (Date) new Object();