Map<Integer, String> map = new TreeMap<>();
map.put(1, "String1");
map.put(2, "String2");
map.put(3, "String3");
Я хотел преобразовать значения map
, чтобы установить. Я знаю, я мог бы легко сделать
Set<String> set = new HashSet<>(map.values());
Размышляя об этом, мне было любопытно, что же такое "1006" само по себе? Итак, я попробовал это
System.out.println("Set:"+ (map.values() instanceof Set));
System.out.println("List:"+ (map.values() instanceof List));
System.out.println("Queue:"+ (map.values() instanceof Queue));
System.out.println("SortedSet:"+ (map.values() instanceof SortedSet));
И на удивление был
Set:false
List:false
Queue:false
SortedSet:false
Это - все, что сказано в документации.
представление коллекции значений, содержащихся в этой карте
Затем я посмотрел на декомпилированный файл класса.
public Collection<V> values() {
if (values == null) {
values = new AbstractCollection<V>() {
public Iterator<V> iterator() {
return new Iterator<V>() {
private Iterator<Entry<K,V>> i = entrySet().iterator();
public boolean hasNext() {
return i.hasNext();
}
public V next() {
return i.next().getValue();
}
public void remove() {
i.remove();
}
};
}
public int size() {
return AbstractMap.this.size();
}
public boolean isEmpty() {
return AbstractMap.this.isEmpty();
}
public void clear() {
AbstractMap.this.clear();
}
public boolean contains(Object v) {
return AbstractMap.this.containsValue(v);
}
};
}
return values;
}
Почему Java возвращает абстрактную реализацию вместо List
/ Set
/ Queue
, которая может быть немедленно совместима с вариантами использования?