Dökme olduğu teknik olarak mümkün. Javac tarafından durumunuzda böyle olmadığı kolayca kanıtlanamaz ve JLS aslında bunu geçerli bir Java programı olarak tanımlar, bu nedenle bir hatayı işaretlemek yanlış olur.
Çünkü List
bir arayüzdür. Yani Date
aslında burada List
olduğu gibi gizlenmiş bir alt sınıf olabilir List
- ve sonra döküm Date
mükemmel tamam olacaktır. Örneğin:
public class SneakyListDate extends Date implements List<Foo> {
...
}
Ve sonra:
List<Foo> list = new SneakyListDate();
Date date = (Date) list; // This one is valid, compiles and runs just fine
Bu tür bir senaryoyu saptamak her zaman mümkün olmayabilir, çünkü örneğin örneğin bir yöntemden geliyorsa çalışma zamanı bilgileri gerektirecektir. Ve olsa bile, derleyici için çok daha fazla çaba gerektirecektir. Derleyici, sınıf ağacının hiç eşleşememesi nedeniyle kesinlikle imkansız olan dökümleri önler. Görüldüğü gibi burada durum böyle değil.
JLS kodunuzun geçerli bir Java programı olmasını gerektirdiğini unutmayın. In 5.1.6.1. İzin verilen Daralma Referans Dönüşümü :
Bir daraltma referans dönüşüm referans türünden mevcut S
başvuru tipi için T
, eğer tüm aşağıdakilerden olan gerçek :
- [...]
- Bir aşağıdaki durumların geçerli :
- [...]
S
bir arabirim türüdür, T
bir sınıf türüdür ve T
bir final
sınıfı adlandırmaz.
Derleyici Yani bile olabilir davanız aslında kanıtlanabilir imkansız olduğunu anlamaya JLS Geçerli Java programı olarak tanımlar çünkü bayrak bir hata izin verilmez.
Yalnızca bir uyarı gösterilmesine izin verilir.
List
Burada özel bir şey yok.Date d = (Date) new Object();