Varargs methods produce warnings for generic parameters #132

orionll opened this Issue Dec 12, 2012 · 2 comments


None yet

3 participants

List<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = new ArrayList<Integer>();
List<Integer> list3 = new ArrayList<Integer>();

List<List<Integer>> listOfLists = new ArrayList<List<Integer>>();

assertThat(listOfLists).contains(list1, list2, list3); // Type safety: A generic array of List<Integer> is created for a varargs parameter

This problem can be solved by overloading a varargs method with a different number of arguments:

public S contains(T value1) { ... }
public S contains(T value1, T value2) { ... }
public S contains(T value1, T value2, T value3) { ... }
public S contains(T value1, T value2, T value3, T value4) { ... }

This technique is used, for example, in Guava:


The problem is that the vararg takes an array of T, where it should just an array of Object. For tests it really doesn't matter type safety in the vararg. A failing test will tell the user that something is wrong.

@alexruiz alexruiz was assigned Jan 10, 2013

Wouldn't adding a @SafeVarargs annotation suffice?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment