2013-06-13 14 views
6

Ben ... şaşırmış ama bu derler:Java: Null olmayan bir dizi somut parametrelenmiş türlere neden başvuru yapabilirim?

İşte
public <T extends Database> ColMetaData<T>[] getTableColumnsAsEnums() { 
      Class<? extends ColMetaData> cls = this.columnsEnumToken(); 
      return cls.<ColMetaData<T>[]>getEnumConstants(); } 

columnsEnumToken için yöntemdir:

// Returns a class token for an enum class 
public Class<? extends ColMetaData> columnsEnumToken() { 
    return this.e_colsToken; 
} 

(Ben ikinci hat aşağıda derleme değil neden görebilirsiniz sanırım)

bazı sorular:

  • bu yöntem "tipi mi kasa"?

  • bu hat derleme yok Neden:

    Class<? extends ColMetaData> cls = this.columnsEnumToken();

    Ama bu, çünkü uyumsuz türleri derlenmeyecektir:

    Class<? extends ColMetaData<T>> cls = this.columnsEnumToken();

  • Neden yasal yöntemle getTableColumnsAsEnums() için geri dönmek için bir beton parametreli tip, ColMetaData<T>[] bir dizi. Bunların kesinlikle verboten olduğunu düşünmüştüm, çünkü onların güvenli bir şekilde çalışmasını sağlamak için çalışma zamanı yoktu.

+1

'cls. []> getEnumConstants()' ın kendi başına derlemesi yapılmamalıdır çünkü bu genel bir yöntem değildir. –

+0

İlk mermi noktasını yanıtlamak için yeterli bilgi yok: columnsEnumToken() 'nedir? Uyumsuz tür hata mesajı tam olarak nedir? –

+0

Evet, görünüşe göre ben herhangi bir sınıf açılı parantez içine 'return' ifadesi koymak ve çalışacaktır. Muhtemelen bir hatayı rapor etmelidir, fakat tip bilgisinin basitçe görmezden geldiği görülmektedir. – scottb

cevap

2

Sınıf

Teorik olarak, bir Class parametreli tipini temsil edemez. Örneğin, List<String> için bir sınıf yoktur, bu nedenle Class<List<String>> yazmamalısınız, ancak yalnızca Class<List>.

Ancak, Class<? extends List<String>> mantıklı olabilir. Örneğin, varsa

public class MyStringList extends ArrayList<String>{} 

MyStringList.class jenerik dizi tipiyle yanlış bir şey yok

, bu Java herhangi örneğini bize yasaklar bu sadece var bir Class<? extends List<String>>

Jenerik dizidir bir Class<MyStringList> olduğunu ... Ama sebep çok inandırıcı değil. Güvende olduğunu bildiğin kadarıyla devam edebilirsin ve oyunculardan bir tane oluşturabilirsin. Aslında, Java'da genel bir dizi oluşturmak için basit bir yol var. Varargs X... ile bir yöntem çağırdığında, bir X[] nesnesi oluşturulacak ve X herhangi bir tür olabilir.

Uyumlu atama

Görünüşe göre bazı geriye dönük uyumluluk nedenle, biz List[]List<String>[] atayabilirsiniz. Bu nedenle, dönüş türü ColMetaData<T>[] iken ColMetaData[] nesnesini döndürebilirsiniz.

+0

"Örneğin, Liste için sınıf yok": Sanırım ne dediğinizi biliyorum, ancak teknik olarak Listesinin bir listesi var: Liste .class == List.class. – scottb

+0

'List .class' :) – ZhongYu

+0

diye bir şey yok. Aynı şeyi farklı şekillerde söylüyorsun. – scottb

1

ColMetaData<T>[]'un neyi temsil ettiğini düşünün. Java'da, jenerikler kesinlikle bir derleme zamanıdır.Çalışma zamanında, varolmaya devam ederler. Öyleyse, çalışma zamanını gerçekten anlattığınız şey, aslında somut bir tip olan ColMetaData örneğinizin olması. Bununla birlikte, bu, dizi için rasgele bir tür kullanmaktan farklıdır. Dizi türü hala ColMetaData, ve Java bunu derleme zamanında belirleyebilir. Daha sonra derleyici, yalnızca depoladığınız örneklerin doğru jenerik türünü kullandığını izlemek için gereklidir.

+0

Bağımsız değişken yok. Ancak, bu, ColMetaData örneklerini, ColMetaData örneklerinden ayrı ve ayrı olacak şekilde bildirdiğinizde örtülü garantiden oldukça farklıdır. Bu ayrım, sizin de belirttiğiniz gibi, türetilmiş güvenlik türlerinin tüm güvencelerinin kaybolmasına neden olan, parametreli dizi türlerinde var olmayı bırakır. – scottb

+0

Haklı olabilirsiniz; Bunu test etmek zorundayım. "Tip güvenliği", derleme zamanında. Her şey derleyicinin nasıl ele aldığına bağlı. Derleyici bu durumda başarısız olursa, bunun bir hata olduğunu düşünürdüm. Hakikaten, her türlü güvenliğin bytecode seviyesinde atlanabileceğinden şüpheleniyorum. Sahtekarlar muhtemelen bu konuda bir şeyler yapar. – jpmc26

+1

Test etmeye gerek yok. Angelika Langer'ın Generics SSS'de bazı testleri var: http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ104 – scottb

İlgili konular