2009-10-02 20 views
7

Ben şu kodkullanma jenerik kontrolsüz dönüşüm uyarısı

String innerText = null; 
innerText = this.getException(detail.getChildElements()); 

Bu uyarıyı neden olan sebep

Tip güvenliği: tip Yineleyiciyi ifadesi Iterasyon için uyacak şekilde kontrolsüz dönüşüm ihtiyacı

Başvurulan yöntem:

Diğer yöntem, getChildElements(), dokunamadığım bir JAR dosyasında. Başka uyarı veya hata yok. zamanki gibi uyarı bu tür kurtulmak gibi

Googling itibaren

, bu derleyici vaktinden güvenliğini garanti edemez çünkü

@SuppressWarnings("unchecked") 
String innerText = this.getException(detail.getChildElements()); 

görünüyor ama SuppressWarnings kullanmaktan kaçınmak tercih ediyorum mümkünse ... daha iyi bir yolu var mı?

DÜZENLEME: getChildElements() uyarıyı bastırmak için here

+5

Sadece olmak mutlu Java jenerik kodunuzu hiç derlemek için izin verir. Şahsen uyarıyı orada bırakırım - bu tam olarak geçerli bir uyarıdır. –

cevap

16

belgelenmiştir, ancak bunu yaparsanız, üçüncü taraf kitaplığından üzerinde% 100 güvenerek ve Java jenerik türleri güvence atarak vardır: o Çalışma zamanında yükseltilen herhangi bir ClassCastException, doğrudan bir yayınla gerçekleşir. Biz kod güvenli — yazın ve biz bir kara kutu olarak paketin dışında hiçbir arama tedavi kanıtlayabilirim ve içeriği hakkında herhangi bir yorum güvenmeyin sadece

Bizim kodlama standardı uyarıları bastırmak etmektir ham koleksiyonu. Yani bastırma son derece nadirdir. Genellikle kod güvenliyse, derleyici bunu belirleyebilir, ancak bazen ona biraz yardım etmeliyiz. Bazı istisnalar, özel bir bağlamdan "kaçma" olmayan genel tür dizileri içerir.

Üçüncü taraf kitaplığına tam olarak güvenmiyorsanız, yeni bir koleksiyon oluşturun ve içeriği OMEElementImpl ürününe ekledikten sonra ekleyin. Bu şekilde, eğer kütüphanede bir hata varsa, bir kodun zaman ve uzaklığa uzak olması yerine, bir ClassCastException ile patlatmak yerine, onu hemen öğreneceksiniz. Örneğin

:

Iterator<?> tmp = detail.getChildElements(); 
Collection<OMElementImpl> elements = new ArrayList<OMElementImpl>(); 
while (tmp.hasNext()) 
    elements.add((OMElementImpl) tmp.next()); /* Any type errors found here! */ 
String innerText = getException(elements.iterator()); 

hatırla, jenerik güzel görünüyorsun daha az yazar gerektiren kodunu yapmak için icat edilmedi! Jeneriklerin sözü: Kodunuz, uyarı olmadan derlerse, tip güvenlidir. Bu kadar. Uyarılar ihmal edildiğinde veya bastırıldığında, bir operatör olmadan kod gizemli bir şekilde ClassCastException'u yükseltebilir.


Güncelleme: Bu durumda, özellikle, getChildElements sonucu OMElementImpl bir yineleyici olduğunu varsaymak son derece riskli görünüyor. En iyi ihtimalle, bunların OMElement olduklarını varsayabilir ve bu yalnızca sınıftaki herhangi bir şeyden değil, özellikle sınıftan ima edilir.

+0

Böyle bir üçüncü taraf kitaplığı tarafından döndürülen bir koleksiyonun içeriğinin doğrulanması iyi bir öneridir. Yeni bir koleksiyon oluşturmak için bir alternatif olarak –

+0

(Google Tahsilat http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html#transform içinde 'Iterables.transform' bakın java.lang.Iterable,% 20com.google.common.base.Function) –

+0

Eh, ben yeni genç geliştiriciyim ve bu özel durumda varsayımını yapmak tamam emin edilmiştir; Ben (ve bu konudaki teknik sorumlumum) sadece küçük uyarı ikonunu görmekten nefret ediyorum. Yine de iyi bir genel tavsiye vermek için + 1 kabul edildi. – Pops