Хобрук: Ваш путь к мастерству в программировании

Почему varargs всегда является последним параметром в сигнатуре метода?

Почему varargs должен быть последним параметром в сигнатуре метода?

Я хочу знать причину.


  • Если это не так, то как при использовании метода компилятор может узнать, где заканчиваются аргументы varargs и начинается аргумент следующего метода? 21.02.2012
  • Варарги можно отличить, сначала идентифицируя не-варарги и принимая остальные как ваарги, независимо от того, появляются ли они в начале или в конце. В настоящее время, если есть пять аргументов, последний из которых является varargs, тогда он разрешается, поскольку все, что идет после четвертого, является varargs. Это также можно изменить, например, если есть пять аргументов с первым как varargs, разрешить от конца к началу, например, последние четыре являются нормальными, и все, что есть, за исключением последних четырех, является частью первого vararg :) Я думаю, что это только что реализовано таким образом, так как нет реальной необходимости до сих пор 21.02.2012
  • См. интервью с C family of language создателями здесь [C Family Interview](gotw.ca/publications/c_family_interview.htm), где Гослинг говорит, что у меня было личное правило: в общем и целом я ничего не добавлял только потому, что считал это крутым. Поскольку у меня все время было сообщество пользователей, я ждал, пока несколько человек не ополчатся на меня, прежде чем что-то вставлять. или три человека подошли ко мне и сказали, что это должна сделать Java. Тогда я бы начал говорить, ну, может быть, люди действительно будут его использовать. 21.02.2012

Ответы:


1

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

21.02.2012
  • Спасибо за ваш ответ, но, судя по приведенным выше комментариям, я думаю, что это невозможно, например: «публичный недействительный тест (строка... имена, строковый код)», компилятор не может различать имена и параметры кода. 21.02.2012
  • Да, оно может. Он считает все аргументы, вставляет последний в code, а все остальные в names. 21.02.2012
  • Вы правы, говоря, что varargs всегда должен быть последним, что значительно упрощает работу команды компилятора Java. Однако на самом деле это не проблема синтаксического анализа, поскольку синтаксический анализатор генерирует AST. Это правило просто упрощает многие другие части компилятора, такие как разрешение перегрузок. 21.02.2012
  • @Adam Mihalcin Я не знаю концепции AST, пожалуйста, обсудите больше и ее связь с проблемой varargs. 21.02.2012
  • @MJM Определение AST выходит за рамки вашего вопроса, но вот объяснение размером с комментарий: компилятор разделен на лексер, который токенизирует исходный код, парсер, который строит абстрактные синтаксические деревья (AST) из токенов, необязательная проверка типов и оптимизатор, которые работают с AST, и генератор кода для преобразования этих AST из некоторого внутреннего представления в байт-код. См. en.wikipedia.org/wiki/Compiler для обзора того, как работает компилятор. 22.02.2012

  • 2

    Основная причина в том, что в противном случае это было бы потенциально неоднозначно....

    Например, как компилятор может определить, являются ли аргументы переменными или отдельными именованными аргументами в длинном списке аргументов с несколькими переменными?

    Представьте сигнатуру метода, например:

    printNames(String... girls, String... boys);
    

    Если вы сделаете printNames("Lucy", "Jo", "Paul"), Джо будет мальчиком или девочкой?

    Еще один пример двусмысленности: наличие переменных vararg в начале списка аргументов может вызвать проблемы при наличии перегруженных методов. Например:

    printFruit(String... apples, String orange);
    printFruit(String... apples, String grapefruit, String orange);
    

    Как компилятор может определить, является ли предпоследний аргумент грейпфрутом или дополнительным яблоком?

    Обратите внимание, что это не уникально для Java, большинство языков, которые поддерживают varargs, позволяют только затем быть в конце списка аргументов по той же причине.

    21.02.2012
  • множественные varargs полностью отличаются от varargs всегда последними. 21.02.2012
  • @Ignacio Vazquez-Abrams Другие языки также не допускают использование нескольких varargs? 21.02.2012
  • Они тесно связаны... Я бы сказал, что ограничение varargs только последним аргументом - это то, что делает использование нескольких varargs невозможным. 21.02.2012
  • @mikera Я принял ваш комментарий (вы говорите: они тесно связаны), но в последнем примере компилятор может различить три параметра, два последних параметра - грейпфрут и апельсин, а другие - яблоки. 21.02.2012
  • Компилятор также может просто полностью отклонить все варианты, которые могут вызвать двусмысленность, а не просто включить их в спецификацию. 21.02.2012
  • Этого нельзя добиться, решая аргументы в обратном порядке? В любом случае среда выполнения будет знать, сколько аргументов передано, если их всего 20, то последние два - грейпфрут и апельсин, а остальные - яблоки. 21.02.2012
  • Я не понимаю, почему ваш ответ не принимается как правильный ответ? 11.09.2017
  • Новые материалы

    Как я могу подписаться на тему изображений в ROS Matlab и получить изображение RGB?
    Привет, Пожалуйста, как я могу извлечь изображение из сообщения ROS Image, за которым следует imshow? Я уже подписался на правильную тему, но message.getData() дает мне объект..

    Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
    Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

    Как интегрировать модель машинного обучения на ios с помощью CoreMl
    С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..