@DerMike'ın cevabını açıklamak istiyorum:
İlk olarak, silme işlemi JDK'nın elimine ettiği anlamına gelmez çalışma zamanında tür bilgisini . Derleme zamanı türü denetimi ve çalışma zamanı türü uyumluluğunun aynı dilde bir arada var olmasına izin veren bir yöntemdir. Bu kod bloğunun da ifade ettiği gibi, JDK silinmiş tür bilgilerini saklar - sadece kontrol edilen dökümler ve diğer şeylerle ilişkili değildir.
İkincisi, bu, genel bir sınıfa, kontrol edilen beton tipinden heirarşinin tam bir seviye yukarısında jenerik tip bilgisi sağlar - yani jenerik tip parametrelerine sahip soyut bir ebeveyn sınıfı, somut bir uygulama için tip parametrelerine karşılık gelen beton tiplerini bulabilir o doğrudan ondan devralır. Bu sınıf soyut ve somutlaştırılmış olsaydı ya da somut uygulama iki seviye aşağı olsaydı, bu işe yaramazdı (her ne kadar biraz jimmying, bir veya daha düşük sınıfa kadar önceden belirlenmiş sayıda seviyeye uygulanabilmesine rağmen X jenerik tip parametreleri ile, vb.).
Her neyse, açıklamaya geçelim. Referans kolaylığı için satırlara ayrılmış kod tekrar:
1 # Sınıf genericParameter0OfThisClass =
2 # (Sınıf)
3 # ((Parametreli Tip)
4 # getClass ()
5 # .getGenericSuperclass ())
6 # .getActualTypeArguments () [0];
Bu kodu içeren genel türlere sahip soyut sınıf olalım. Bunu kabaca içeriden okumak:
- Satır 4, mevcut somut sınıfın Sınıf örneğini alır. Bu, derhal torunumuzun beton tipini tanımlar.
- 5. satır, bu sınıfın üst türünü Tür olarak alır; bu biziz. Parametrik bir tip olduğumuzdan, kendimizi güvenle ParameterizedType (satır 3) 'e atabiliriz. Anahtar, Java bu Type nesnesini belirlediğinde, yeni ParameterizedType örneğindeki tür parametrelerimizle tür bilgisini ilişkilendirmek için alt öğede bulunan tür bilgisini kullanmasıdır. Artık jeneriklerimiz için somut tiplere erişebiliyoruz.
- 6. satır, sınıf kodunda bildirildiği gibi, jeneriklerimize eşlenen türler dizisini alır. Bu örnek için ilk parametreyi çıkarıyoruz. Bu bir Tür olarak geri gelir.
- Satır 2, bir Sınıfa döndürülen son Türü verir. Bu güvenlidir çünkü genel tip parametrelerimizin hangi türleri alabileceğini biliyoruz ve bunların hepsinin sınıf olacağını doğrulayabiliriz (Java'da bir Class örneği olmayan genel bir parametre almaya nasıl devam edeceğinden emin değilim) aslında onunla ilişkili).
... ve işte bu kadar. Bu nedenle, kendi somut uygulamamızdan tür bilgisini kendimize geri itiyoruz ve bir sınıf tanıtıcısına erişmek için kullanıyoruz. getGenericSuperclass () 'ı ikiye katlayabilir ve iki seviyeye gidebiliriz veya getGenericSuperclass ()' ı ortadan kaldırabilir ve somut bir tür olarak kendimiz için değerler alabiliriz (uyarı: Bu senaryoları test etmedim, henüz benim için gelmediler).
Somut çocuklarınızın keyfi sayıda atlama olması veya somut ve nihai değilseniz, özellikle (değişken derinlikteki) çocuklarınızdan birinin kendi jeneriklerine sahip olmasını beklemek zor olur. Ancak genellikle bu hususlar etrafında tasarım yapabilirsiniz, bu da sizi en çok şekilde yönlendirir.
Umarım bu birine yardımcı olmuştur! Bu yazının eski olduğunu biliyorum. Muhtemelen bu açıklamayı kesip başka sorular için saklayacağım.