Чем объясняется следующее:
public class GenericsTest {
//statement 1
public ArrayList<Integer>[] lists;
public GenericsTest()
{
//statement 2
lists = new ArrayList<Integer>[4];
}
}
Компилятор принимает оператор 1. Оператор 2 помечен компилятором как «создание универсального массива».
Хорошим объяснением, которое я видел относительно запрета универсальных массивов, является этот , утверждающий, что, поскольку массивы ковариантны, а универсальные не являются, вы могли бы подорвать универсальную типизацию, если разрешили универсальные массивы.
Оставляя в стороне аргумент о том, должен ли язык идти на крайние этапы создания такого рода сложной непоследовательности в обработке дженериков, чтобы вы не стреляли в себя независимо от того, как сильно вы пытаетесь (и если кто-то знает о каких-либо хороших дискуссиях) По поводу относительных достоинств / недостатков вопроса, пожалуйста, напишите, мне было бы интересно увидеть аргументы), почему утверждение (1) должно быть разрешено, если (2) нет?