Потребность в новой строке [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. По сути, этот параметр необходим для того, чтобы можно было возвращать массив правильного типа.