2015-06-25 29 views
9

Java gölge tipi parametreleri var mı? Kendimi test etmeyi zor buluyorum çünkü Java jenerikleri çalışma zamanında doğrulanamıyor. Bu kod Verilen örnek içinİç sınıflarda tip parametrelerine bağlı tip beyanı

:

public class NestedGeneric<T> { 
    private InnerGeneric<T> innerGenericInstance; 

    private static class InnerGeneric<T> { 
     public T innerGenericField; 
    } 

    NestedGeneric() { 
    innerGenericInstance = new InnerGeneric<T>(); 
    } 
} 

ikisi de aşağıda tablolar ince derlemek: NestedGeneric denilen bir tür parametresi ve yapıcı geçirilir

NestedGeneric<Integer> test1 = new NestedGeneric<Integer>(); 
NestedGeneric.InnerGeneric<String> test2 = new NestedGeneric.InnerGeneric<String>(); 

, T nedir? Her zaman nestedGeneric'a aktarılan tip parametresiyle aynı mı olacak?

Başka bir deyişle, bir dış sınıf tür parametreleri iç sınıflara genel tür bildirimleri için geçirilebilir mi? Başka bir deyişle

+1

Evet, ancak zorunlu değildir. İçsel sınıfı başka bir nesneyle de yapabilirsiniz, ancak iç içe geçmiş sınıf oluşturmada T'yi bir 'U' olarak değiştirmek istersiniz. –

+0

Tür parametreleri gölgeli görünüyor http://ideone.com/8DihKQ – ReyCharles

cevap

6

, ben bir dış sınıflar parametreleri bir iç sınıflar genel tür beyanlarına geçirilebilir tipi olabilir, soru herhalde?

sayılı dış ve iç statik sınıf arasında (miras gibi ya da bir alan olarak) herhangi bir ilişki yoktur. Eğer örnekteki gibi dış sınıfın herhangi bağımlılık olmadan iç statik sınıfının bir nesne oluşturabilirsiniz:

NestedGeneric.InnerGeneric<String> test2 = new NestedGeneric.InnerGeneric<String>(); 

Ancak kullandığınızda genel tür türetilen bir alan olarak iç sınıfının bir örneği dış sınıfı:

private InnerGeneric<T> innerGenericInstance; 

innerGenericInstance = new InnerGeneric<T>(); 

üçüncü bir alternatif olarak (statik olmayan) bir alan olarak iç sınıfını tanımlamak olacaktır:

private class InnerGeneric<T> { 
    public T innerGenericField; 
} 
Şimdi bir üye değişkenden beri dış sınıftan tür alacak olan

.

İç statik & dış sınıfını tanımlayan yorumda belirtildiği gibi, türüyle yalnızca okuyucuyu karıştırırsınız (ve kendinize daha sonra bir zamanda).

public class NestedGeneric<T> { 
    private InnerGeneric<T> innerGenericInstance; 

    private class InnerGeneric<T> { 
     private T innerGenericField; 

     public InnerGeneric(T innerGenericField){ 
      this.innerGenericField = innerGenericField; 
     } 

     public T getInnerGenericField(){ 
      return this.innerGenericField; 
     } 
    } 

    NestedGeneric(T someGenericVariable) { 
     innerGenericInstance = new InnerGeneric<T>(someGenericVariable); 
     T innerGenericField = innerGenericInstance.innerGenericInstance(); 
    } 
} 
4

farklı bir jenerik ile beyan edilmelidir. Kodunuzda tek bir tip parametresi int, T parametresi vardır. Yani iç ve dış T aynı tip parametrelerdir.

Tabii ki daha fazla parametre alabilirsin.

public class NestedGeneric<OUTER_TYPE> { 

    private static class InnerGeneric<INNER_TYPE> { 
    public INNER_TYPE innerGenericField; 
    } 

    public NestedGeneric() { 
    InnerGeneric<OUTER_TYPE> innerGenericInstance = new InnerGeneric<OUTER_TYPE>(); 

    InnerGeneric<String> secondInnerGenerics = new InnerGeneric<String>(); 
    } 
} 
INNER_TYPE

ve OUTER_TYPE iki farklı tip parametrelerdir. Satır InnerGeneric<OUTER_TYPE> innerGenericInstance = new InnerGeneric<OUTER_TYPE>();innerGenericInstanceOUTER_TYPE ile aynı tür tarafından parametrized thad diyecek. Ama aynı olmak zorunda değiller. secondInnerGenerics değişkeninde olduğu gibi.

+0

Bu durumda iç genel sınıf farklı bir şekilde davranılan statik değil – 6ton

+0

İç sınıf statik, ancak iç sınıfın örneği olmayan bir -statik üye değişkeni. –

5

Bu gölgeleme değildir: gibi

Evet, ama statik değiştirici ile
public class NestedGeneric<T> { 
    private InnerGeneric<T> innerGenericInstance; 

    private static class InnerGeneric<U> { 
     private U innerGenericField; 
    } 

    NestedGeneric() { 
     innerGenericInstance = new InnerGeneric<T>(); 
    } 
} 
+0

Yani sadece önemli olan beyanın noktası mı? Farklı şekilde isimlendirilebilecek olsalar bile, davranışları aynı oldukları zaman anlamak isterim. İç sınıf tipi parametreler dış sınıfla aynı ismi taşıyorsa, hala tamamen bağımsız mı? –