2013-03-12 32 views
19

Üniversitemde ileri düzeyde programlamada derslerim var ve bu kodun nasıl çalıştığını anlamakta biraz sorun yaşıyorum.Java'da gelişmiş polimorfizm

public final class GenericClass<T> { 
    private void overloadedMethod(Collection<?> o) { 
     System.out.println("Collection<?>"); 
    } 

    private void overloadedMethod(List<Number> o) { 
     System.out.println("List<Number>"); 
    } 

    private void overloadedMethod(ArrayList<Integer> o) { 
     System.out.println("ArrayList<Integer>"); 
    } 

    public void method(List<T> l) { 
     overloadedMethod(l); 
    } 

    public static void main(String[] args) { 
     GenericClass<Integer> test = new GenericClass<Integer>(); 
     test.method(new ArrayList<Integer>()); 
    } 
} 

neden bu yasanın yazılı "Koleksiyon <? >" ?

cevap

14

method(List<T> l) bildirimi, T türünde hiçbir sınır belirtmez. T'nin Numara veya Sayı'nın bir alt sınıfı olduğunu garanti etmez. Bu nedenle, derleyici yalnızca bu yöntemin overloadedMethod(Collection<?> o)'u aramasına karar verebilir.

Unutmayın: Derleme sonrasında, jeneriklerle ilgili bilgiler artık sınıf dosyalarında mevcut değildir. Eğer genel bir tür tanımlamak zaman

+0

sayesinde çünkü sürümü, cevabın neden ' –

+0

' Program baskılar dışarı 'aşırı yüklenmiş (Liste o)' için Listesini 'aşırı yüklenmiş (Liste o)' değişen 'yerine' toplanması sonra bile açıklıyor en önemli şey son cümlen. Bu her şeyi açıklıyor! –

+0

Oldukça iyi bir yanıt, ancak -1 'GenericClass ) 'ile aynı çağrıya neden olur. Yani burada başka bir şey var. –

-1

, karşılık gelen ham türü otomatik Sen Joker türleri hakkında okursanız, Sen List<Number> göreceksiniz

public void method(List<T> l) { 

} 

public void method(List<Object> l) { 

} 

ile değiştiriyor Bu yöntem sağlanır ve List<Object> veya ArrayList<Integer> ve List<Object>'un herhangi bir ilişki türü yoktur. List<Object>, Collecion<?>'un bir alt türüdür, bu nedenle bu yöntem çağrılır.

+0

Aslında, buradaki mantık, soruyu cevaplamak için yeterli değil. Derleyici, hangi türden aşırı yüklenmenin, * önce * tipi silme işleminin gerçekleşeceğine karar verir. –

-1

Eğer kafanızda üç kavram koymak gerekir aşırı yöntemle başa:

  1. Boks Genişletme
  2. Var_args
  3. Sorununuz genişliyor ilk noktada yatıyor

java derleyicisi, bu kavramların her birine, yukarıda listelendikleri sırayla, öncelikleri verir, böylece genişletmeyi ve yönteminizi test.method(new ArrayList<Integer>()); olarak çağırdığınızda derleyici ArrayList<Integer>()Collection<?> genişledi olabileceğini bulur ve onu en yüksek önceliğe sahip olduğundan bu sürüm çağırır ve diğer olanları Not ihmal: Eğer private void overloadedMethod(ArrayList<?> o) ve private void overloadedMethod(List<?> o) diğer iki yöntemden beyanı değiştirirseniz derleyici da Collection<?> arayacak tercih biri

+0

Hayır. Özel boşluk aşırı yüklendiğindeMethod (Liste o) {// o zaman numaralı Toplama Koleksiyonunda çağrılır. – AmitG

+0

denedin mi? –

+0

"@Java Oyuncu: Ben de ofiste Bu forumu ziyaret ve en kısa sürede BTW bunu denedin mi o zaman çalıştı Eğer burada sonuca bırakabilir – AmitG