Исходный код apache-commons colectionutils
Следующий фрагмент кода был взят из файла CollectionUtils.java платформы Commons:
private static class CardinalityHelper<O> {
final Map<O, Integer> cardinalityA, cardinalityB;
public CardinalityHelper(final Iterable<? extends O> a,
final Iterable<? extends O> b) {
cardinalityA = CollectionUtils.<O> getCardinalityMap(a);
cardinalityB = CollectionUtils.<O> getCardinalityMap(b);
}
public final int max(final Object obj) {
return Math.max(freqA(obj), freqB(obj));
}
public final int min(final Object obj) {
return Math.min(freqA(obj), freqB(obj));
}
public int freqA(final Object obj) {
return getFreq(obj, cardinalityA);
}
public int freqB(final Object obj) {
return getFreq(obj, cardinalityB);
}
private final int getFreq(final Object obj,
final Map<?, Integer> freqMap) {
final Integer count = freqMap.get(obj);
if (count != null) {
return count.intValue();
}
return 0;
}
}
getCardinalityMap возвращает <O> Map<O, Integer>
Может кто-нибудь, пожалуйста, помогите мне понять
- что значит
cardinalityA = CollectionUtils.<O> getCardinalityMap(a);
средства? Это какой-то типизинг? - Что возвращает тип
<O> Map<O, Integer>
средства? - Как называется этот трюк?
Спасибо
1 ответ
1) что означает кардинальность A = CollectionUtils. getCardinalityMap(а); средства? Это какой-то типизинг?
Это не типотипирование. Это явная установка универсального параметра для универсального метода. CardinalityHelper имеет универсальный параметр <O>
как вы можете видеть из декларации:
private static class CardinalityHelper<O> {
Это безопасный способ для клиентов CardinalityHelper использовать этот класс.
2) Что возвращает тип
<O> Map<O, Integer>
средства?
объявление общего параметра.Карта - тип возврата.
3) Как называется этот трюк?
Он использует общие методы Java.
Вы также можете найти симулированное использование в стандартной библиотеке JDK. Например: java.util.Collections.sort (java.util.List)
Реализация принципов метапрограммирования в Java очень ограничена, поэтому вы можете использовать только параметры Generic Type для создания типовобезопасных контейнеров, что требуется для строго типизированной природы Java.