Да и да. Это означает, что данные не изменяются более чем одним потоком одновременно. Тем не менее, ваша программа может работать, как ожидалось, и выглядеть поточно-ориентированной, даже если это принципиально не так.
Обратите внимание, что непредсказуемость результатов является следствием «состояния гонки», которое, вероятно, приводит к изменению данных в порядке, отличном от ожидаемого.
Приведение типа обычно требуется только в том случае, если вы используете предварительные обобщения Java. Если вы посмотрите документацию для Collection.toArray (T [])
, вы увидите, что он знает, что тип возвращаемого массива совпадает с типом переданного массива. Итак, вы можете написать:
List<String> list = new ArrayList<String>();
list.add("Foo");
String[] array = list.toArray(new String[0]);
Вы передаете массив, чтобы сообщить коллекции, какой тип результата вы хотите, который может не совпадать с типом в коллекции. Например, если у вас есть List
, вы можете преобразовать его в Object []
, Stream []
или ByteArrayOutputStream []
- очевидно, что последний будет работать, только если каждый элемент на самом деле является a ByteArrayOutputStream
.
если вы используете list.toArray (), он вернет вам массив объектов. Приведение к массиву String вызовет исключение, даже если элементы, хранящиеся в списке, относятся к типу String.
если вы используете list.toArray (Object [] a), он сохранит элементы списка в массиве «a». Если элементы внутри списка являются String, и вы даете массив String, тогда он будет хранить элементы внутри массива String, если данный массив недостаточно велик для хранения элементов внутри списка, тогда он будет расширять данный список.
Да, вам нужно приведение вниз, поскольку типом возврата toArray является Object [].
Вам необходимо передать (new String [0]) в качестве параметра, поскольку методу необходимо знать, какой тип массива он должен возвращать (массив строк, дат и т. Д.). Внутри все элементы списка фактически являются объектами, поэтому список не знает тип элементов, которые он содержит, и поэтому не знает, какой тип массива должен возвращать, если вы не укажете его в качестве параметра.