gpt4 book ai didi

java - 对于 Java 中的静态帮助器类,使用泛型还是对象类型更好?

转载 作者:行者123 更新时间:2023-12-01 11:24:38 24 4
gpt4 key购买 nike

前几天我正在编写一个程序,要求我:获取 ArrayList<String> 中特定对象的频率。 ,删除 List 未指定的所有出现的给定项目等。界面。我决定编写自己的帮助程序类,并希望使其尽可能可重用。我决定指定 List作为集合的参数类型,因此我可以将它用于任何实现 List 的类界面。但这些类通常是使用泛型定义的,我不知道要删除的项目是什么类类型。因此,我要么必须通用地定义静态辅助方法,因为静态类不能显式包含泛型类型,要么将要删除的对象的类类型定义为 Object 。我以两种方式实现它,见下文,但我想知道使用一种方式是否比另一种方式有任何好处。

有关该主题的一些其他问题:

  1. 为什么我可以通过在方法头而不是类头中定义泛型类型来解决静态上下文中对泛型类型的引用?
  2. 使用此静态方法时,为什么我不必必须在其用法中声明类 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;
}

}

最佳答案

这两个操作都对给定对象引用和列表内的元素之间的相等性 (.equals()) 进行操作,并且相等性不限于相同类型的对象,因此您不应该限制 o 与列表的类型参数的类型相同。

但是,原始类型不好,因此您不应该使用原始类型List。当不需要对类型变量进行任何约束时,您应该使用通配符对其进行参数化:

public static void removeAllOccurrences(List<?> items, Object o)
public static int getFrequencyOf(List<?> items, Object o)

关于java - 对于 Java 中的静态帮助器类,使用泛型还是对象类型更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30930168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com