2012-05-28 12 views
13

JDK 1.6 için, Koleksiyonlar sınıf takas yöntemi şöyle yazılır:Neden Collections.swap giriş listesini kopyalıyor? Kaynakta

public static void swap(List<?> list, int i, int j) { 
    final List l = list; 
    l.set(i, l.set(j, l.get(i))); 
} 

ne sebep geçti listenin son kopyasını oluşturmak için vardır? Neden doğrudan geçen listeyi değiştirmiyorlar? Bu durumda, ham tip uyarısı da alırsınız.

+2

İşte ilgilenen herkes için Grepcode üzerinde ilgili kaynak var /grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java#Collections.swap%28java.util.List%2Cint%2Cint%29 –

+1

Nelerdir? downvote ile? –

cevap

18

Listenin hiç kopyası yok, listeye yalnızca referansın bir kopyası var. Son anahtar kelime önemli değil. Bununla birlikte, ham tipin kullanılması önemlidir. parametre yerine kullanılacak olması halinde, derleyici bir hata rapor verecek:

public static void swap(List<?> list, int i, int j) { 
    // ERROR: The method set(int, capture#3-of ?) in the type List<capture#3-of ?> 
    // is not applicable for the arguments (int, capture#4-of ?) 
    list.set(i, list.set(j, list.get(i))); 
} 

Bunun anlamı, onlar jenerik eksikliklerini aşmak için ara değişken kullanıyorsanız ve hata mesajı kurtulmak için söyledi.

İlginç olan soru: Neden genel bir yöntem kullanmıyorlar? Aşağıdaki kod çalışır:

public static <T> void swap(List<T> list, int i, int j) { 
    list.set(i, list.set(j, list.get(i))); 
} 

cevabı, bu yöntem eski kodda uyarılar çiğ türleriyle yöntemi çağrılırken ürettiğini: http:/

List list = ...; 
// WARNING: Type safety: Unchecked invocation swap2(List, int, int) 
// of the generic method swap2(List<T>, int, int) of type Swap 
Collections.swap(list, 0, 1); 
+0

Yani jenerik kullanmaktan kaçınmak için listeye son referansı kullanıyorlar? –

+1

Gerçekten de, ara değişkenleri jeneriklerin eksikliklerini atlatmak ve hata mesajından kurtulmak için kullanıyorlar. – nosid

+3

API, bir joker karakterinin yeterli olacağı genel bir parametreye sahip bir yöntemin uygulama detayı ile kirlenmemelidir (ve temel bir Java bilgisini kabul ederek daha temiz ve kolay anlaşılır). Şimdi, genel yöntemini bir uygulama yöntemi olarak kullanabilir ve kamu yöntemini (ortak bir deyim) çağrısı yapabilirsiniz, ancak, ek bayt kodunun zaman zaman HotSpot'u satır içi olarak belirlediğinden şüpheliyim (ya da birileri bunu yapmasa bile endişeliydi). t). –

İlgili konular