Bu, geçenlerde bir röportajda sorduğum bir soru olarak adayın Java diline eklenmesini görmek istediği bir şey olarak ortaya çıktı. Genellikle Java'nın jenerikleri somutlaştırmadığı bir acı olarak tanımlanır , ancak zorlandığında, aday bana orada olsaydı başarabileceği türden şeyleri söyleyemezdi.
Açıktır ki, Java'da ham türlere (ve güvenli olmayan kontrollerde) izin verildiği için, jenerikleri List<Integer>
tersine çevirmek ve (örneğin) gerçekten String
s içeren bir sonuç elde etmek mümkündür . Tip bilgisi somutlaştırıldığında bu açıkça imkansız hale getirilebilirdi; ama bundan daha fazlası olmalı !
İnsanlar , gerçekleştirilmiş jenerikler mevcutsa, gerçekten yapmak isteyecekleri şeylerin örneklerini gönderebilirler mi? Demek istediğim, açıkçası List
çalışma zamanında a türünü alabilirsiniz - ama bununla ne yapardınız?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
DÜZENLEME : Yanıtlar temelde Class
bir parametre olarak bir parametre olarak geçme ihtiyacı hakkında endişeli göründüğü için buna hızlı bir güncelleme (örneğin EnumSet.noneOf(TimeUnit.class)
). Bunun mümkün olmadığı bir yerde daha fazlasını arıyordum . Örneğin:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?