When I initialize List, I am able to do this:
List<Object[]> foo = new ArrayList<>();
foo.add(new Object[]{816, "foo", 2.6});
But when I want to simplify it using Arrays.asList:
List<Object[]> bar = Arrays.asList(new Object[]{"bar", 286});
It cannot compile with error:
incompatible types: inference variable T has incompatible bounds equality constraints: java.lang.Object[] lower bounds: java.lang.Object
Why it cannot do the type inference right and how to fix this?
Advertisement
Answer
Remember that ... is just syntactic sugar for an array parameter. You can call a method with a variadic parameter foo(Object...) either using
foo("hello", 1);
or
foo(new Object[]{"hello", 1});
since the compiler constructs the second form anyway.
Because the receiver type isn’t considered when the compiler infers types, it looks at Arrays.asList(new Object[]{"bar", 286}) and thinks that you mean to create a list of Object, not a singleton list of Object[].
The easiest way with your existing syntax is just to add an explicit type parameter:
List<Object[]> bar = Arrays.<Object[]>asList(new Object[]{"bar", 286});
Adding the <Object[]> tells the compiler what T should be.
Or, if you don’t need the list to be mutable:
List<Object[]> bar = Collections.singletonList(new Object[]{"bar", 286});