2010-03-21 35 views
1

有沒有什麼方法可以在Java中進行這項工作?作爲Java方法參數的泛型集合

public static void change(List<? extends Object> list, int pos1, int pos2) { 
    Object obj = list.get(pos1); 
    list.set(pos1, list.get(pos2)); 
    list.set(pos2, obj); 
} 

我已經成功地避免了警告和錯誤的唯一方法是這樣的:

public static <T> T change(List<T> list, int pos1, int pos2) { 
    T obj = list.get(pos1); 
    list.set(pos1, list.get(pos2)); 
    list.set(pos2, obj); 
    return obj; 
} 

,但我不喜歡被強迫返回一個值。

回答

8

做一個generic method

public static <T> void change(List<T> list, int position1, int position2) { 
    T obj = list.get(position1); 
    list.set(position1, list.get(position2)); 
    list.set(position2, obj); 
} 
+0

+1但是,像聚建議,我會用一個通配符 – helpermethod 2010-03-21 11:24:20

+0

@Helper方法,我相信set方法不會使用通配符的工作,因爲這兩個類型的(?)插入的對象的列表和類型將是未知的 – josefx 2010-03-21 12:05:02

+0

+1哦,謝幕,你是對的。 – helpermethod 2010-03-21 13:35:59

7

java.util.Collections,不過已經有了swap(List<?> list, int i, int j)

這是它是如何在OpenJDK source code實施:

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

有趣的是,它採用的是原始List類型來完成這項工作。代碼會在編譯時生成警告,但大概是@author Josh Bloch和Neal Gafter認爲這是可以忍受的。

+1

謝謝,我已經將@krosenvold答案標記爲已接受,因爲它回答了問題,但我將使用Collections#swap,因爲它已經實現。 – 2010-03-21 12:49:44

+0

有趣的實施......他們也很奇怪,他們將列表標記爲final。 – helpermethod 2010-03-21 13:37:32

+1

@Helper方法 - 你應該嘗試標記一切爲最終。減少錯誤的方式。如果你這樣做「正確」,你會發現大約90-95%的變量可以做出最終決定。 Checkstyle和/或PMD有一張支票,告訴你什麼時候你有可能被標記爲最終的但不是。 – TofuBeer 2010-03-21 17:48:51

0

使用捕捉助手:

public static void change(List<?> list, int pos1, int pos2) { 
    changePrivate(list, pos1, pos2); 
} 

public static <T> void change(List<T> list, int pos1, int pos2) { 
    T obj = list.get(pos1); 
    list.set(pos1, list.get(pos2)); 
    list.set(pos2, obj); 
}