2016-05-03 2 views
1

, проходя через Autoboxing и unboxing в java, я узнал, что Java преобразует примитивные типы данных в класс Wrapper и наоборот, когда это необходимо. например если функция принимает Integer как параметр, если мы передаем значение как 1, тогда компилятор java преобразует его в new Integer(1). теперь ниже мое дело.Почему Java поддерживает перегрузку функций для примитивных типов данных?

public class JavaTest 
{ 

    public static void Test(Integer integer) 
    { 
     System.out.println("in Integer"); 
    } 

    public static void Test(int integer) 
    { 
     System.out.println("in int"); 
    } 

    public static void main(String[] args) 
    { 
     Test(1); 
    } 
} 

В этом случае java должен был исключить исключение во время компиляции. но он успешно компилируется и печатает ниже результата

в междунар

если я удаляет Test (INT целое) метод, то Java дает мне результат

в целое

, поэтому мой вопрос в том, почему java разрешает такую ​​перегрузку функции?

+2

нет его не дублировать – Abhijit

+1

да, это своего рода есть. вам нужно сначала понять разницу между классами и типами примитивов. – Vucko

+0

Я думаю, что это похоже, но не дубликат - посмотрите здесь контекст. – Mena

ответ

3

Java допускает такую ​​перегрузку для обратной совместимости.

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

Поэтому в вашем примере найден только метод, который принимает аргумент int. Когда вы удаляете этот метод, совпадение не встречается на первом этапе разрешения перегрузки метода, а на втором этапе используется автоматический бокс, чтобы соответствовать методу, который принимает аргумент Integer.

15.12.2. Compile-Time Step 2: Determine Method Signature

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

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

    Это гарантирует, что любые вызовы, которые были действительны на языке программирования Java, прежде чем Java SE 5.0 не рассматривается неоднозначно в результате введения переменных методов арности, неявного бокса и/или распаковка. Однако объявление метода переменной arity (§8.4.1) может изменить метод, выбранный для выражения вызова метода данного метода, поскольку метод переменной arity рассматривается как метод фиксированной arity в первой фазе. Например, объявление m (Object ...) в классе, который уже объявляет m (Object), приводит к тому, что m (Object) больше не выбирается для некоторых выражений вызова (таких как m (null)), как m (Object [])) является более конкретным.

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

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

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

+2

Не рекомендуется отвечать на повторяющиеся вопросы в соответствии с FAQ http://meta.stackexchange.com/questions/10841/how-should- дублированных вопросы-быть обработаны. Нужно искать соответствующие дубликаты и голосовать вместо этого. – Tunaki

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