Мы должны использовать приведение типа объекта.toArray ()?

String[] a = c.toArray(new String[0]);

во-первых: мне нужен тип бросания здесь? (Я думаю, мы должны написать как (String[])c.toArray(); но я видел это как раз c.toArray() без использования типа cast. Это действительно так?

второй: почему мы пишем new String[0]?

3 ответов


приведение типа обычно требуется только в том случае, если вы используете Java pre-generics. Если вы посмотрите на документы для Collection.toArray(T[]) вы увидите, что он знает, что тип возвращаемого массива совпадает с типом передаваемого массива. Итак, вы можете написать:

List<String> list = new ArrayList<String>();
list.add("Foo");
String[] array = list.toArray(new String[0]);

вы передаете массив, чтобы сообщить коллекции, какой тип результата вы хотите, который может не совпадать с типом в коллекции. Например, если у вас есть List<OutputStream> вы можете преобразовать это в Object[], a Stream[] или ByteArrayOutputStream[] - очевидно, что последний будет работать, только если каждый элемент на самом деле и a ByteArrayOutputStream. Это также означает, что если у вас уже есть массив нужного типа и размера, содержимое можно скопировать в него вместо создания нового массива.

предыдущая версия этого ответа была неточной, кстати - если вы используете перегрузку, которая не принимает никаких параметров, вы всегда вернуться Object[] которого не может быть В ролях:

List<String> list = new ArrayList<String>();
list.add("Foo");

// toArray doesn't know the type of array to create
// due to type erasure
Object[] array = list.toArray();

// This cast will fail at execution time
String[] stringArray = (String[]) arrray;

EDIT: я только что заметил, что это также упоминается в ответе erdemoo, но это не помешает иметь его здесь:)


Если вы используете list.toArray (), он вернет вам массив объектов. Приведение к строковому массиву вызовет исключение, даже если элементы, хранящиеся в списке, являются строковым типом.

Если вы используете list.toArray (Object[] a), он будет хранить элементы в списке в массиве "a". Если элементы внутри списка являются строковыми и вы даете строковый массив, то он будет хранить элементы внутри строкового массива, если данный массив недостаточно велик для хранения элементов внутри списка, то он будет расширяться список.


  1. да, вам нужен downcast, так как тип возврата toArray-Object[].

  2. вам нужно передать (новая строка[0]) в качестве параметра, так как метод должен знать, какой массив он должен возвращать (массив строк, дат и т. д.) Внутренне все элементы списка фактически являются объектами, поэтому список не знает тип элементов, которые он держит, и поэтому он не знает, какой массив он должен вернуть, если вы не предоставите его как параметр.