Явное приведение параметров к Object в вызове метода vararg сделает компилятор счастливым, не прибегая к @ SuppressWarnings.
public static <T> List<T> list( final T... items )
{
return Arrays.asList( items );
}
// This will produce a warning.
list( "1", 2, new BigDecimal( "3.5" ) )
// This will not produce a warning.
list( (Object) "1", (Object) 2, (Object) new BigDecimal( "3.5" ) )
// This will not produce a warning either. Casting just the first parameter to
// Object appears to be sufficient.
list( (Object) "1", 2, new BigDecimal( "3.5" ) )
Я считаю, что проблема заключается в том, что компилятор должен выяснить, какой конкретный тип массива создавать. Если метод не является универсальным, компилятор может использовать информацию о типе из метода. Если метод является универсальным, он пытается выяснить тип массива на основе параметров, используемых при вызове. Если типы параметров являются однородными, эта задача проста. Если они различаются, компилятор пытается быть слишком умным, на мой взгляд, и создает универсальный массив типа union. Тогда он вынужден предупредить вас об этом. Более простым решением было бы создать Object [], когда тип не может быть лучше сужен. Приведенное выше решение заставляет именно это.
Чтобы лучше это понять, поэкспериментируйте с вызовами приведенного выше метода списка по сравнению со следующим методом list2.
public static List<Object> list2( final Object... items )
{
return Arrays.asList( items );
}