2016-04-30 2 views
0

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

For every actual parameter P, Si be the set of corresponding formal parameters that matches best. then S will be the intersection of all Si. 

И для этого существует 4 типа правил.

  1. Четк.совп
  2. Promotion
  3. Стандартного Конверсия
  4. User Defined Конверсия
  5. Многоточие (не рассматривается все)

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

+3

См. [JLS-8.4.9. Overloading] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.9), который включает в себя следующее: * при вызове метода (§15.12), количество фактических аргументов (и любых явных аргументов типа) и типы аргументов во время компиляции используются во время компиляции для определения сигнатуры метода, который будет вызываться (§15.12.2). Если метод, который должен быть вызван, является методом экземпляра, фактический метод, который будет вызываться, будет определен во время выполнения, используя динамический поиск метода (§15.12.4). * –

ответ

3

Аналогичный процесс? Ну, это зависит от того, что значит «похоже».

Это, однако, хорошо документированы в спецификации языка Java,
глава 15.12 Method Invocation Expressions
и особенно Подраздел 15.12.2. Compile-Time Step 2: Determine Method Signature.

Процесс определения применимости начинается с определения потенциально применимых методов (§15.12.2.1).

Остальная часть процесса разделена на три фазы, чтобы обеспечить совместимость с версиями языка программирования Java до Java SE 5.0. Фазы:

  1. На первом этапе (§15.12.2.2) выполняет разрешение перегрузки, не допуская бокс или распаковку преобразования, или использование переменного метода арности вызова. Если на этом этапе не обнаружен какой-либо применимый метод, обработка продолжается до второй фазы.

  2. Вторая фаза (§15.12.2.3) выполняет перегрузочное разрешение при разрешении бокса и распаковки, но все же исключает использование вызова метода переменной arity. Если на этом этапе не обнаружен какой-либо применимый метод, обработка продолжается до третьей фазы.

  3. Третий этап (§15.12.2.4) позволяет осуществлять перегрузку с использованием методов переменной arity, бокса и распаковки.

Выбор метода, является ли это применимо будет, в случае общих методов (§8.4.4), требуют анализа аргументов типа. Аргументы типа могут передаваться явно или неявно. Если они передаются неявно, из аргументов следует вывести оценки аргументов типа (§18 (Type Inference)).

Если в ходе одной из трех фаз тестирования применимости было идентифицировано несколько применимых методов, то выбирается наиболее конкретный вариант, как указано в разделе §15.12.2.5.

Глава 15.12.2.5 Choosing the Most Specific Method суммирует себя довольно хорошо:

Язык программирования Java использует правило, выбирается наиболее специфичный метод.

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

Конечно, это немного сложнее, чем это.

Смежные вопросы