【发布时间】:2015-06-19 04:56:56
【问题描述】:
前几天我正在编写一个程序,要求我:获取ArrayList<String> 中特定对象的频率,删除给定项目的所有出现等,等等。List 接口未指定.我决定编写自己的辅助类,并希望使其尽可能可重用。我决定将List 指定为集合的参数类型,这样我就可以将它用于任何实现List 接口的类。但是这些类通常是使用泛型定义的,我不知道要删除的项目是什么类类型。所以我要么必须定义静态辅助方法,因为静态类不能显式包含泛型类型,要么将要删除的对象的类类型定义为Object。我以两种方式实现了它,见下文,但我想知道使用其中一种方式是否有任何好处。
关于该主题的一些进一步问题:
- 为什么我可以通过在方法头而不是类头中定义泛型类型来解决静态上下文中的泛型引用?
- 当使用这个静态方法时,为什么我不必须在其使用中声明类Type?即
ListTools_V2.getFrequencyOf(ArrayList<String> items, String s)仍然有效。
使用 Object 类类型实现
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;
}
}
【问题讨论】:
-
老兄,我希望我不会毁了你的一天:docs.oracle.com/javase/7/docs/api/java/util/…
-
@jangroth 感谢您指出这一点,但我仍然很高兴我自己实现了它们。在整个过程中肯定会学习一些基本原则。