2009-06-29 3 views
7
String[] a = c.toArray(new String[0]); 

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

Во-вторыхи.? Кроме того, почему мы пишем new String[0]

+0

зависит от типа c. – gimel

+0

Примечание: вы также можете использовать 'c.toArray (new String [] {});' –

ответ

12

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

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

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

+0

Можем ли мы сказать, что я пишу новую String [0] за то, что не вернул null в качестве результата ???? – Johanna

+0

(Уточнено и исправлено). Я не совсем понимаю комментарий, хотя Джоанна - не могли бы вы объяснить, что вы имеете в виду? –

+0

Это правда, что если элементы массива больше, чем коллекция, мы можем использовать ** новую строку [0] ** ?? – Johanna

1
  1. Да вам смиренное, так? Тип возвращаемого объекта toArray - Object [].

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

+1

хорошо, но я думаю, что нам нужно upcast здесь !!! – Johanna

4

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

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

Смежные вопросы