Потребность в новой строке [0] в методе Set toArray()

Я пытаюсь преобразовать набор в массив.

Set<String> s = new HashSet<String>(Arrays.asList("mango","guava","apple"));
String[] a = s.toArray(new String[0]);
for(String x:a)
      System.out.println(x);

И это прекрасно работает. Но я не понимаю значения new String[0] в String[] a = s.toArray(new String[0]);,

Я имею в виду, сначала я пытался String[] a = c.toArray();, но это не сработает. Почему нужна new String[0],

2 ответа

Решение

Это массив, в котором должны храниться элементы набора, если он достаточно большой; в противном случае для этой цели выделяется новый массив того же типа времени выполнения.

Object [] toArray (), возвращает Object[] который не может быть приведен к String[] или любой другой тип массива.

T [] toArray (T [] a), возвращает массив, содержащий все элементы в этом наборе; тип времени выполнения возвращаемого массива является типом указанного массива. Если набор помещается в указанный массив, он возвращается в него. В противном случае новый массив выделяется с типом времени выполнения указанного массива и размером этого набора.

Если вы пройдете через код реализации (я выкладываю код из OpenJDK), вам будет понятно:

 public <T> T[] toArray(T[] a) {
     if (a.length < size)
     // Make a new array of a's runtime type, but my contents:
     return (T[]) Arrays.copyOf(elementData, size, a.getClass());
     System.arraycopy(elementData, 0, a, 0, size);
     if (a.length > size)
         a[size] = null;
    return a;
 }

Этот параметр является результатом одного из многих хорошо известных ограничений в системе обобщений Java. По сути, этот параметр необходим для того, чтобы можно было возвращать массив правильного типа.

Другие вопросы по тегам