Oracle'ın web sitesinde Java'nın tür silinmesini okudum .
Tip silme ne zaman gerçekleşir? Derleme zamanında mı çalışma zamanında mı? Sınıf ne zaman yüklenir? Sınıf ne zaman somutlaştırılır?
Birçok site (yukarıda belirtilen resmi öğretici dahil) tür silme derleme zamanında gerçekleştiğini söylüyor. Tür bilgileri derleme zamanında tamamen kaldırılırsa, tür bilgisi veya yanlış tür bilgisi olmadan jenerik kullanan bir yöntem çağrıldığında JDK tür uyumluluğunu nasıl denetler?
Aşağıdaki örneği düşünün: Say sınıfının A
bir yöntemi var empty(Box<? extends Number> b)
. A.java
Sınıf dosyasını derliyor ve alıyoruz A.class
.
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
Şu anda başka bir sınıf oluşturmak B
yöntemi çağırır empty
olmayan bir parametreli bağımsız değişken (ham tip): empty(new Box())
. Biz derlemek B.java
ile A.class
sınıf yolunda, Javac bir uyarı yükseltmek için akıllı yeterlidir. Yani A.class
sahiptir buna depolanan bazı tür bilgileri.
public class B {
public static void invoke() {
// java: unchecked method invocation:
// method empty in class A is applied to given types
// required: Box<? extends java.lang.Number>
// found: Box
// java: unchecked conversion
// required: Box<? extends java.lang.Number>
// found: Box
A.empty(new Box());
}
}
Benim tahminim, sınıf yüklendiğinde tür silme gerçekleşir, ancak bu sadece bir tahmin. Peki ne zaman oluyor?