Возьмем следующую строку кода примера:
Set<String> someSet = someColletion.stream().map(p -> p.toString()).collect(Collectors.toSet());
Я хочу a HashSet
. Принимая отладчик к коду, я действительно получаю HashSet
. Я посмотрел на java.util.stream.Collectors.toSet()
, чтобы увидеть следующий код:
public static <T> Collector<T, ?, Set<T>> toSet() {
return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add,
(left, right) -> { left.addAll(right); return left; },
CH_UNORDERED_ID);
}
Контракт гарантирует Set
, а реализация принимает решение о HashSet
; кажется разумным. Однако для моей реализации требуется постоянный поиск времени, гарантированный HashSet
, а не только старый Set
. Если реализация toSet()
решает использовать say a FooSet
, которая полностью соответствует его правам, моя реализация скомпрометирована.
Каково наилучшее решение этой проблемы?