我前幾天正在編寫一個程序,要求我:獲取ArrayList<String>
中特定對象的頻率,刪除接口未指定的給定項等的所有匹配項等。我決定寫我自己的幫手類,並希望儘可能地重複使用它。我決定將List
指定爲集合的參數類型,所以我可以將它用於任何實現List
接口的類。但是這些類通常使用泛型來定義,我不知道要刪除的項目是什麼類的類型。所以我要麼一般地定義靜態輔助方法,因爲靜態類不能顯式地包含泛型類型,要麼定義要刪除的對象的類類型爲Object
。我用兩種方式實現了它,見下面,但我想知道是否有任何好處使用其中一個。在Java中使用泛型或對象類型爲靜態輔助類會更好嗎?
在話題的一些其他問題:
- 爲什麼我只能通過在方法頭,而不是類頭定義它來解決泛型類型的引用在靜態情況下?
- 當使用這種靜態方法時,爲什麼我不是必須在其用法中聲明Type類?即
ListTools_V2.getFrequencyOf(ArrayList<String> items, String s)
仍然有效。
實現使用對象類類型
import java.util.List;
/** General utility class for performing frequently needed operations
on any class implementing the List interface **/
public class ListTools {
public static void removeAllOccurrences(List items, Object o) {
while(items.contains(o)) {
items.remove(o);
}
}
public static int getFrequencyOf(List items, Object o) {
int frequency = 0;
for(Object item : items) {
if(item.equals(o)) {
frequency++;
}
}
return frequency;
}
}
使用泛型實現
import java.util.List;
/** General utility class for performing frequently needed operations
on any class implementing the List interface. This implementation
uses generics to maximize reusability. **/
public class ListTools_V2 {
public static <E> void removeAllOccurrences(List<E> items, E o) {
while(items.contains(o)) {
items.remove(o);
}
}
public static <E> int getFrequencyOf(List<E> items,E o) {
int frequency = 0;
for(E item : items) {
if(item.equals(o)) {
frequency++;
}
}
return frequency;
}
}
[這](https://docs.oracle.com/javase/tutorial/java/generics/why:當沒有必要約束類型變量反對任何你應該用通配符參數吧。 html)和[this](https://docs.oracle.com/javase/tutorial/java/generics/methods.html)都很好。 – TNT
夥計,我希望我不會毀掉你的一天:http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#frequency(java.util.Collection,%20java。 lang.Object) –
@jangroth感謝您指出了這一個了,但我仍然很高興我實現了他們自己。在整個過程中肯定學習一些基本原則。 – bmcentee148