Set.of() is the closest way we've got to a literal Set without having introduced a special syntax for that in the language.
The idea is that if you conceptually want to write Set<String> set = { "hello", "world" }; instead, you write Set<String> set = Set.of("hello", "world"); In that context, it makes sense to reject Set constructed with the same element twice because this is usually a programming error. So Set.of("hello", "hello") throws an IAE. If you want a Set from a collection of elements, you can use Set.copyOf(List.of("hello", "hello")) regards, Rémi ----- Mail original ----- > De: "dfranken jdk" <dfranken....@gmail.com> > À: "core-libs-dev" <core-libs-dev@openjdk.java.net> > Envoyé: Samedi 30 Janvier 2021 19:30:06 > Objet: Why does Set.of disallow duplicate elements? > Dear users, > > While looking at the implementation of Set.of(...) I noticed that > duplicate elements are not allowed, e.g. Set.of(1, 1) will throw an > IllegalArgumentException. Why has it been decided to do this? > > My expectation was that duplicates would simply be removed. > > If I do for instance new HashSet<>(<collection containing duplicates>) > it works and duplicates are removed. To me, it looks a bit inconsistent > to have duplicates removed for a collection passed in the constructor, > but not for a collection (even though it is a vararg array) passed to a > static factory method. > > Kind regards, > > Dave Franken