foo() is not safe, it may store non-T in the array, causing problem at 
<T extends List<?>> void foo(T... args)
List<String> array2 = (List<String>)args;
array2 = a_list_of_string;
List<Integer> args = ...; // 
Integer i = args.get(0); // 
By marking the method with @SafeVarargs, you promise to compiler that you are not doing anything naughty like that.
But how in hell can we get a generic array at  to start with? Java doesn't allow generic array creation!
The only sanctioned way of generic array creation is when calling a vararg method
foo( list_int_1, list_int_2 )
then the array isn't accessible to caller, caller can't do  anyway, it doesn't matter how
foo() messes with the array.
But then you think about it, it is the backdoor to create generic array
static <E> E newArray(int length, E... array)
return Arrays.copyOf(array, length);
List<String> array1 = newArray(10);
and generic array literal
static <E> E array(E... array)
List<String> array2 = array( list1, list2 );
So we can create generic array after all... Silly Java, trying to prevent us from doing that.