Why does Guava's ImmutableList have so many overloaded of() methods?

guava, java, overloading

Solution

Varargs and generics do not play nicely together. Varargs methods can cause a warning with generic arguments, and the overloads prevent that warning except in the rare case that you want to add more than 11 items to the immutable list using `of()`.

The comments in the source say:

These go up to eleven. After that, you just get the varargs form, and whatever warnings might come along with it. :(

Note that Java 7's @SafeVarargs annotation was added specifically to eliminate the need for this sort of thing. A single `of(E...)` method annotated with `@SafeVarargs` could be used and would not give warnings with generic arguments.

Problem

I was just looking at Guava's `ImmutableList` and I noticed that the `of()` method was overloaded 12 times. It looks to me that all they needed was: ``` static <E> ImmutableList<E> of(); static <E> ImmutableList<E> of(E element); // not even necessary static <E> ImmutableList<E> of(E... elements); ``` What's the reason for having so many similar variations?

Original source