Понесите меня на некоторое время. Я знаю, что это звучит субъективно и аргументировано какое-то время, но я клянусь, что в конце есть вопросительный знак, и на вопрос можно ответить на объективный вопрос...
Исходя из фона .NET и С#, я в последние годы был испорчен синтаксическим сахаром, который генерирует вместе с методами расширения во многих решениях .NET для общих проблем. Одной из ключевых особенностей, которые делают С# generics настолько чрезвычайно мощным, является тот факт, что, если в информации достаточно информации, компилятор может вывести аргументы типа, поэтому мне почти никогда не приходится их выписывать. Вам не нужно писать много строк кода, прежде чем вы поймете, сколько нажатий клавиш вы сэкономите на этом. Например, я могу написать
var someStrings = new List<string>();
// fill the list with a couple of strings...
var asArray = someStrings.ToArray();
и С# будет просто знать, что я имею в виду, что первый var
должен быть List<string>
, второй - string[]
и что .ToArray()
действительно .ToArray<string>()
.
Затем я перехожу на Java.
Я достаточно разбирался в Java-генериках, чтобы знать, что они принципиально разные, прежде всего в том, что компилятор фактически не компилирует общий код - он разделяет аргументы типа и заставляет его работать в любом случае, в некоторых сложный) способ (который я еще не понял). Но хотя я знаю, что дженерики в Java принципиально разные, я не могу понять, зачем нужны такие конструкции:
ArrayList<String> someStrings = new ArrayList<String>();
// fill the list with a couple of strings...
String[] asArray = someStrings.toArray(new String[0]); // <-- HERE!
Зачем мне создавать новый string[]
, без каких-либо элементов в нем, который не будет использоваться ни для чего, для компилятора Java знать, что это string[]
и не любой другой тип массива, который я хочу?
Я понимаю, что так выглядит перегрузка, и что toArray()
в настоящее время возвращает Object[]
. Но почему было принято это решение, когда эта часть Java была изобретена? Почему этот дизайн лучше, чем, скажем, пропустить .ToArray()
, который полностью перегружает Object[]
и имеет только toArray()
, который возвращает T[]
? Является ли это ограничением в компиляторе или в воображении дизайнеров этой части фреймворка или что-то еще?
Как вы, вероятно, можете сказать из моего чрезвычайно острого интереса к вещам, которые не имеют особого значения, я не спал некоторое время...