Bence diğer cevaplar bunu bir dereceye kadar söyledi, ama çok net değil. Jeneriklerle ilgili sorunlardan biri, yansıtma işlemi sırasında genel türleri kaybetmektir. Yani örneğin:
List<String> arr = new ArrayList<String>();
assertTrue( ArrayList.class, arr.getClass() );
TypeVarible[] types = arr.getClass().getTypedVariables();
Ne yazık ki, döndürülen türler size arr'ın genel türlerinin String olduğunu söyleyemez. İnce bir fark, ama önemli. Çalışma zamanında arr oluşturulduğundan, genel türler çalışma zamanında silinir, böylece çözemezsiniz. Bazı belirtildiği ArrayList<Integer>
gibi ArrayList<String>
bir yansıma açısından aynı görünüyor .
Bu, Generics kullanıcısı için önemli olmayabilir, ancak diyelim ki, kullanıcının bir örneğin somut jenerik türlerini nasıl ilan ettiği hakkında süslü şeyler bulmak için yansıma kullanan bazı süslü çerçeve oluşturmak istediğimizi varsayalım.
Factory<MySpecialObject> factory = new Factory<MySpecialObject>();
MySpecialObject obj = factory.create();
Diyelim ki MySpecialObject
, bu örnek için beyan ettiğimiz somut jenerik tür olduğundan, bir örnek fabrika yaratmak istedik . Peki Fabrika sınıfı, Java tarafından silindiği için bu örnek için açıklanan somut türü bulmak için kendisini sorgulayamaz.
.Net'in jeneriklerinde bunu yapabilirsiniz çünkü çalışma zamanında nesne, jenerik tiplerini bilir çünkü derleyici onu ikilide tamamlar. Silme işlemleri ile Java bunu yapamaz.