На днях я писал программу, которая требовала от меня: получить частоту определенного объекта внутри ArrayList<String>
, удалить все вхождения данного элемента и т. д. и т. д., не указанные в интерфейсе List
. Я решил написать свой собственный вспомогательный класс и хотел сделать его максимально пригодным для повторного использования. Я решил указать List
в качестве типа параметра коллекции, чтобы использовать его для любого класса, реализующего интерфейс List
. Но эти классы обычно определяются с помощью дженериков, и я не знал, к какому классу относится удаляемый элемент. Поэтому мне пришлось либо определить статические вспомогательные методы в общем, поскольку статический класс не может явно содержать общие типы, либо определить тип класса удаляемого объекта как Object
. Я реализовал это обоими способами, см. ниже, но мне интересно, есть ли какие-либо преимущества в использовании одного над другим.
Еще вопросы по теме:
- Почему я могу обойти ссылку универсального типа в статическом контексте, определив его в заголовке метода, а не в заголовке класса?
- Почему при использовании этого статического метода мне не нужно объявлять тип класса при его использовании? то есть
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;
}
}