2013-10-25 2 views
5

Поэтому у меня есть следующие перегруженные методы:Java: перегружено разрешение метода

private static void foo(short... a) 
{ 
    System.out.println("Calling var-len"); 
} 

private static void foo(int a, int b) 
{ 
    System.out.println("Calling int-int"); 
} 

private static void foo(int a, double b) //(3) 
{ 
    System.out.println("Calling int-double"); 
} 

private static void main (String[] args) 
{ 
    foo((short)2, (short)5); //This one outputs "Calling int-int" 
} 

Я знаю, что переменный метод Арности имеет самый низкий приоритет во время фазы разрешения метод, так что в этом случае, если я позвоню foo((short)2, (short)4); я хотел бы получить " Вызов int-int ".

ОДНАКО, если я изменю метод (3) на foo(short a, double b), метод переменной arity выбран! (Java 7). Может ли кто-нибудь объяснить это?

+0

Это интересный вопрос. Отправьте полный тестовый файл с полным набором функций и двумя наборами перегрузок (один показывает поведение A, другое поведение B). – user2864740

+1

Я сам запускал код, но получаю ошибку двусмысленности, а не третий метод. Не могли бы вы прочесть несколько тестов? – cgf

+0

Java 6_24 вызывает неоднозначную ошибку ссылки во время компиляции, что ИМХО - это правильная вещь в соответствии со спецификацией. –

ответ

2

В соответствии со спецификацией:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2

«Тем не менее, декларация метода переменной валентности (§8.4.1) может изменить способ, выбранный для выражения вызова метода данного метода, поскольку метод переменной arity рассматривается как фиксированный метод arity на первом этапе ».

+0

Как это объясняет, почему Java выбирает метод переменной-arity? Не могли бы Вы уточнить? –

+0

В случае foo # 2, имеющего типы 'int, int' и foo # 3, имеющие типы' short, double', передающие оба shorts методам, которые, как я думаю, не приводят к тому, что ни один из методов не является более конкретным, чем другой. В этом случае, как говорит doc, я предполагаю, что переменная arity one оценивается как «короткая, короткая». – Radiodef

+0

@OneTwoThree Я действительно не считаю, что это тоже удовлетворительный ответ. Если true, в основном это просто означало бы, что методы переменной arity оцениваются как фиксированная arity, но последняя в первой фазе. Но я не вижу ничего другого в спецификациях, которые указывают на это как правдоподобное поведение. – Radiodef

-3

Ваш вопрос является типичным примером для численного продвижения в java. Он пытается решить для точного соответствия подписи (короткий, короткий), но в вашем случае у вас нет этого метода. Java проверяет последующий совместимый тип данных (например, int), он поддерживает как короткие, так и внутренние типы данных и пытается найти совпадение, он находит это.

Если ни одна из числовых рекламных кампаний не работает, в вашем коде будет разрешен метод переменных аргументов.

Пожалуйста, ознакомьтесь с числовыми поощрений по ссылке ниже .. http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

+0

Если это способствует аргументам, не следует ли выбирать метод, который принимает 'int, int'? – 0x56794E

+2

Я считаю, что ОП знает, что шорты продвигаются. Вопрос в том, почему изменение третьего метода от 'int, double' до' short, double' приводит к выбору метода varargs по методу int. Вопрос в том, почему изменение метода, который, как предполагается, никогда не называется изменением, вызывает вызов какого-либо из двух методов. Кажется, это нелогично. – Radiodef

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