сбит с толку, почему Object [] objs (тип objs [i] является int []) нельзя преобразовать в int [] [] - PullRequest
7 голосов
/ 10 мая 2019

list.toArray () возвращает Object [] и содержит только int []. Поэтому я подумал, что могу привести его непосредственно к int [] []. Но на самом деле я был неправ, это приведет к исключению приведения.

list.toArray(new int[list.size()][]);

это нормально, но я все еще в замешательстве.

List<int[]> list = new ArrayList<>();
//some code

//cast exception
return (int[][])list.toArray();
//this way is ok
return list.toArray(new int[list.size()][]);

Почему он выбрасывает это исключение?

1 Ответ

8 голосов
/ 10 мая 2019

Здесь:

//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 году вы предпочитаете передавать пустой массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...