newsetfrommapиспользование логического

#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…