2013-07-19 16 views
12

Dersim varsa: Ben döngü için yukarıdaki satırı değiştirene kadarNeden Java genel bir ham sınıf, tür parametreleri belirtilmemişse, tüm jenerik nesnelere nesneyi siler?

public class OtherClass { 
    public void test() { 
     GenericClass a = null; 
     for (String s : a.getList()) { 

     } 
    } 
} 

Neden List<Object> dönmek a.getList() vermez: Başka bir sınıftan bu yöntemi kullanmaya çalıştığınızda

public class GenericClass<TBlah extends Number> { 
    public List<String> getList() { 
     return null; 
    } 
} 

:

GenericClass<Number> a = null; 

bu noktada a.getList At() yapması gerektiği gibi bir List<String> döndürür?

Düzenleme: Neden "a" değişkenimi bildirdiğime göre neden getList() tarafından belirtilen sözleşmenin neden etkileneceğini anlamıyorum. getList() her zaman bir List<String> döndürür, ne TBlah olduğunu farketmez.

+1

Uhm'da oluşturulmuş olan kod ile geriye dönük uyumluluğunu da korumasını unutma, niçin 'null' olarak başlatsın? – fge

+0

@fge Basitlik. Sanırım sorunla alakasız. – Xenoprimate

+7

Çünkü JLS'nin yazarları tarafından yapılan seçim bu. AFAIK, gerekçelendirme, eğer ham türleri kullanırsanız, jenerik tipler umursamıyorsunuz. Çözüm, ham tiplerden kaçınmaktır. –

cevap

8

Çünkü jenerikler bu şekilde çalışır. Bunu, bir List bildirdiğinizde jeneriklerden önce, Object'un bir listesi olduğunu unutmayın. Object'u getirmeniz/almanız bekleniyordu ve nesneyi doğru türde almak için yayınlamak zorunda kaldınız. Aslında, , çalışma zamanında Object listesinin listesidir.

Generics, herhangi bir uyarıda bulunmadığınızı varsaydığınız için derleyici için derleme zamanında derleyici için bir yoldur. Çalışma zamanında List<String> yoktur. Sadece List var. Derleyici sizin için otomatik döküm koyar, böylece kodunuzu String s = list.get(i) yazmadan döküm yapabileceksiniz.

GenericClass a bildirimini bildirdiğinizde, bir raw türü bildiriyorsunuz (bu konuda bir uyarı almanız gerekir), böylece derleyicinin, a.getList() türünün ne tür bir döndürme yapması gerektiğini bilmesi için bir yolu yoktur. Yani Object kullanıyor. GenericClass<Number> a = null;'u bildirdiğinizde derleyici, a.getList() için ne tür bir bekleyeceğini bilir ve istediğinizi kullanır.

Düzenleme: derleyici size imza sözleşme saygı keşke ne olacağını bilemez o açıklığa kavuşturulmalıdır (yani GenericClass<Number> örneğinde olduğu gibi). Sözleşmeye uymuyorsanız (yani, extends Number numaralı ham tür kullanıyorsunuz), sözleşme artık geçerli değildir. Derleyici, herhangi bir tür bilgi mevcut değil gibi davranır. Derleyicinin aynı zamanda ön genericlik çağında

+0

Bu bir çeşit mantıklı. Fakat derleyici neden a.getList() öğesinin ne yapması gerektiğini bilmiyor? Orada yöntem imzasında var. Ve bu, TBlah'ın ne olduğunu açıklamam da önemli değil ... Peki neden ham tipi kullanmam önemli? – Xenoprimate

+0

Bu doğru değil. İmzada değil. İmza, “Number” u genişleten bir “bela” diyor. "Nesne" 'Number' –

+1

'u genişletmediğinden, getList() listesindeki Listesinin dönüş türünü TBlah'ı seçtiğimden etkilemediğinden, bir ham tür (yani basit 'Nesne') kullandınız. olmak. Öyleyse neden önemli? – Xenoprimate

-2

Sen başvurmak ve başvuru aynı type.like olmalıdır Listesine bir yer tutucu/referansa ihtiyacınız

Liste < Dize> x = a.getList();

İlgili konular