Здесь:
//cast exception
return (int[][])list.toArray();
Из-за стирания типа, он создает фактический массив Object . Массив Objects не массив массивов int, поэтому вы не можете его привести. Ящик для яиц не превращается в бутылку для молока только потому, что вы кричите «вот, стань бутылкой».
Чтобы сделать это действительно ясным: вышеприведенный вызов не знает точный тип для использования, поэтому он должен прибегнуть к этому базовому значению по умолчанию Object[]
. А поскольку int[]
имеет тип Object, этот метод списка может затем сохранить эти массивы в массиве результатов. Массив объектов, и каждый объект является массивом int.
Но здесь:
return list.toArray(new int[list.size()][]);
Вы явно говорите, что возвращаемый массив должен иметь тип int[][]
. Таким образом, во время выполнения тело этого метода знает, что оно должно вернуть
тип.
И просто для справки: вы можете предпочесть
return list.toArray(new int[0][]);
Предоставление массива "уже измеренного размера" - это реликт с более ранних времен, как правило, в 2019 году вы предпочитаете передавать пустой массив.