#java #collections
#java #Коллекции
Вопрос:
Метод Collections.newSetFromMap имеет следующую подпись:
public static <E> Set<E> newSetFromMap(Map<E,Boolean> map)
Каково значение параметра Boolean для карты? Это то, о чем мне нужно беспокоиться, если меня интересует только E
тип параметра?
Комментарии:
1. tutorialspoint.com/java/util/collections_newsetfrommap.htm
2. @YCF_L спасибо. Итак, из примера, кажется, что логический параметр для сопоставления полностью игнорируется? Если бы это было так, разве это не должно было быть
Void
?3. @k314159 затем рассмотрим следующие два метода и их возвращаемое значение:
public boolean remove(Object o) { return m.remove(o) != null; }
amp;public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; }
. Оба взяты из декомпилированногоCollections.class
Java 1.8.0_251.
Ответ №1:
Способ newSetFromMap
работы заключается в том, что он использует предоставленную карту и помещает в нее фиктивное значение add
. Все остальные операции просто работают с набором ключей карты. Случается, что используется логическое значение.TRUE как фиктивное значение (см. Источник), поэтому Map<E, Boolean>
для обеспечения типобезопасности требуется тип ввода.
Ограничительный тип также помогает стимулировать правильное использование, согласно документам:
Указанная карта должна быть пустой во время вызова этого метода и не должна быть доступна непосредственно после возврата этого метода. Эти условия гарантируются, если карта создается пустой, передается непосредственно в этот метод, и ссылка на карту не сохраняется, как показано в следующем фрагменте кода:
Set<Object> weakHashSet = Collections.newSetFromMap( new WeakHashMap<Object, Boolean>());
Если бы метод принял a Map<E, Object>
, как это теоретически возможно, было бы легко передать существующую карту, которая уже содержит не булевы значения, что не рекомендуется и может привести к неожиданному поведению.
Так что нет, об этом не о чем беспокоиться, если вы используете метод правильно, как указано в документах.
Комментарии:
1. Кроме того, с использованием оператора diamond разработчик должен беспокоиться об этом еще меньше…
Set<E> weakHashSet = Collections.newSetFromMap(new WeakHashMap<>());
2. @dbl но имейте в виду, что, несмотря на то, что оператор diamond был введен в Java 7, потребовалось до Java 8, чтобы вывод типа работал с этим примером кода. Исходный пример был взят из Java 6…