2009-08-05 34 views
8

Eğer imzası ile bir yöntemi varsa:Java generized sınıf referans

Class<? extends List<String>> getObjectType() 
{ 
     return ?????; 
} 

nasıl Liste sınıfının uygun bir jenerik versiyon iade edilir?

return List.class; //errors 
return List<String>.class; //errors 
return List.class<String>; //errors 

Bunun için uygun sözdizimi nedir?

cevap

9

Bunu açıkça dönüş türüne göndermeniz gerekir. Bu, yalnızca yanlış görünüyor. Bu, Java'nın jenerik sisteminin bir karışıklık olduğu birçok nedenden sadece bir tanesi.

+0

İlginç, önerinizi yapıyor yakın beni alır. ama ben java derleyici ile sınıf derlemek için gittiğimde "dönüştürülemez türleri bulundu: java.lang.Class gerekli: java.lang.Class > " –

+0

Tek, tutulma içinde benim için çalışır, ancak komut satırında derlendiğinde değil. Bunu daha önce hiç görmedim. –

+0

-nowarn seçeneği ile, bazı List.getClass() döndürme durumu için çalışır, ancak hala List.class ile çalışırken gördüğünüzde aynı hatayı alıyorum. –

2

List<String>'u genişleten bir şeyin sınıfını döndürmeniz gerekir. ArrayList<String> bir örnektir. Sen deneyebilirsiniz:

ArrayList<String> myList = new ArrayList<String>(); 
... 
return (Class<? extends List<String>>)myList.getClass(); 
+1

Açık yayınlamaya ihtiyaç var. Genel getClass yöntemi, sınıf sınıfı 'u döndürür. –

+0

@John: Bunu işaretlediğiniz için teşekkür ederiz. Kontrol ettim ve bu gerçekten geçerli. Örneği güncellemeyi dahil etmek için güncelledim. –

5

kitabında "Etkili Java" (İkinci Baskı, sayfa 137) From: "dönüş türleri olarak joker türlerini kullanmayın Aksine kullanıcılar için daha fazla esneklik sağlamak yerine, bu zorlamak olacaktır. Joker karakterlerini kendi müşteri kodlarında kullan. " döküm için

söyleyen

, öncelikle geçici değişken oluşturmak gerekir:

@SuppressWarnings("unchecked") 
Class<? extends List<String>> result = ....; 
return result; 

Eğer atamalar açıklamaları olabilir, çünkü bu çalışır. O, return üzerinde çalışmıyor. Bunu da yönteme ekleyebilirdiniz, ancak bu diğer sorunları da gizleyebilir.

+1

Benim için sadece uyarmadı, dökümanı ekleyene kadar aslında bir derleme hatası üretti. –

+0

Doğru. "Liste" ve "Liste <...>" tamamen farklı türlerdir (sadece Dize ve Tamsayı gibi), bu nedenle dökümlere ihtiyacınız vardır. Ama oyuncu bir uyarıya sebep olacak ve bunu bastırmanız gerekiyor. –

0

List.class and List <Dize> .class - tüm bu durumlarda döküm gerekir. Gerçekten böyle somethig, zamanında Liste <Dize> olan bir tür, gerek: Tutulma şikayetçi durdurur olarak

interface StringList extends List<String> {}; 

public Class<? extends List<String>> getObjectType() { 
    return StringList.class; 
} 
İlgili konular