Generics ve perde arkasında gerçekte ne yaptıkları hakkında bu soru adresinde iyi bir tartışma var, bu yüzden hepimiz Vector<int[]>
in tamsayı dizilerinden oluşan bir vektör olduğunu ve HashTable<String, Person>
ın anahtarları string ve değerleri Person
olan bir tablo olduğunu biliyoruz.
Ancak, beni şaşırtan şey Class<>
kullanımı.
Java sınıfı Class
ın da bir şablon adı alması gerekiyor (ya da eclipse'deki sarı alt çizgi bana öyle söylüyor). Oraya ne koymam gerektiğini anlamıyorum. Sınıf nesnesinin tüm amacı, bir nesne hakkında tam bilgiye sahip olmadığınızda, yansıtma ve benzeri şeyler içindir. Neden Class
nesnesinin hangi sınıfı tutacağını belirtmemi istiyor? Belli ki bilmiyorum, yoksa Class
nesnesini kullanmazdım, belirli olanı kullanırdım.
Class sınıfının üretilmiş versiyonunu kullanmak, diğer şeylerin yanı sıra, aşağıdaki gibi şeyler yazmanıza olanak tanır
Class<? extends Collection> someCollectionClass = someMethod();
ve sonra aldığınız Class nesnesinin Collection
öğesini genişlettiğinden ve bu sınıfın bir örneğinin (en azından) bir Collection olacağından emin olabilirsiniz.
Java Dokümantasyonundan:
[...] Daha da şaşırtıcı olanı, sınıf Sınıf üretilmiştir. Sınıf değişmezleri artık tür belirteçleri olarak işlev görür ve hem çalışma zamanı hem de derleme zamanı tür bilgisi sağlar. Bu, yeni AnnotatedElement arayüzündeki getAnnotation yöntemi ile örneklenen statik fabrikalar tarzını mümkün kılmaktadır:
<T extends Annotation> T getAnnotation(Class<T> annotationType);
Bu genel bir yöntemdir. T tipi parametresinin değerini argümanından çıkarır ve aşağıdaki kod parçasında gösterildiği gibi uygun bir T örneği döndürür:
Author a = Othello.class.getAnnotation(Author.class);
Jeneriklerden önce, sonucu Author'a atmanız gerekirdi. Ayrıca, derleyicinin gerçek parametrenin Annotation'ın bir alt sınıfını temsil edip etmediğini kontrol etmesini sağlamanın bir yolu yoktu. [...]
Bu tür şeyleri hiç kullanmak zorunda kalmadım. Kimse kullanmadı mı?
Genellikle Class
ile joker karakterler kullanmak istersiniz. Örneğin, Class<? extends JComponent>
, sınıfın JComponent
in bir alt sınıfı olduğunu belirtmenize izin verir. Eğer Class
örneğini Class.forName
ile aldıysanız, örneğin bir örnek oluşturmaya çalışmadan önce döküm yapmak için Class.asSubclass
kullanabilirsiniz.