Если мы не можем создать экземпляры универсальных массивов, почему язык имеет универсальные типы массивов? Какой смысл иметь тип без объектов?
Единственная причина, о которой я могу думать, это varargs - foo(T...)
. В противном случае они могли бы полностью очистить универсальные типы массивов. (Ну, им действительно не нужно было использовать массив для varargs, поскольку varargs не существовало до 1.5 . Это, вероятно, еще одна ошибка.)
Так что это ложь, вы можете создавать экземпляры универсальных массивов через varargs!
Конечно, проблемы с универсальными массивами все еще существуют, например,
static <T> T[] foo(T... args){
return args;
}
static <T> T[] foo2(T a1, T a2){
return foo(a1, a2);
}
public static void main(String[] args){
String[] x2 = foo2("a", "b"); // heap pollution!
}
Мы можем использовать этот пример для демонстрации опасности универсального массива.
С другой стороны, мы использовали общие varargs в течение десятилетия, и небо еще не падает. Таким образом, мы можем утверждать, что проблемы преувеличены; Это не важно. Если разрешено явное создание универсального массива, здесь и там будут ошибки; но мы привыкли к проблемам стирания, и мы можем жить с этим.
И мы можем указать на foo2
, чтобы опровергнуть утверждение о том, что спецификация защищает нас от проблем, от которых, по их утверждениям, они не хотят. Если бы у Sun было больше времени и ресурсов для 1,5 , я считаю, что они могли бы достичь более удовлетворительного решения.