Вы можете перегрузить метод:
public static UnorderedList newUnorderedList(Object first, Object... other) {
return newUnorderedListImpl(Stream.concat(Stream.of(first), Arrays.stream(other)));
}
public static UnorderedList newUnorderedList(Object[] items) {
return newUnorderedListImpl(Arrays.stream(items));
}
private static UnorderedList newUnorderedListImpl(Stream<?> items) {
return new UnorderedList(
items
.peek(e -> checkNotNull(e, "Cannot create null list item"))
.map(e -> {
if (e instanceof Component) return newListItem((Component) e);
if (e instanceof String) return newListItem((String) e);
throw new IllegalArgumentException("List item must be String or Component but is neither: " + e.getClass().getName());
}).toArray(ListItem[]::new)
);
}
Затем вызов с существующим массивом закончится на newUnorderedList(Object[] items)
, тогда как фактический вызов varargs закончится на newUnorderedList(Object first, Object... other)
, даже если только один аргумент был указан, пока этот аргумент не является массивом. Поскольку предполагается, что единственным аргументом является String
или Component
, это не проблема.
Единственная возможность, которая была потеряна с этими двумя методами, - это возможность вызова метода без аргумента. Если это проблема, вам нужно добавить еще одну перегрузку:
public static UnorderedList newUnorderedList() {
return newUnorderedListImpl(Stream.empty());
}