Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оператор переменного числа аргументов (...), приорететнее специфических параметров? 
V
    Опции темы
Royan
  Дата 17.10.2007, 23:59 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Посмотрите внимательно на этот код:
Код

public class Test {
    public void foo(String ... a) {
        System.err.println("TEST#foo");
    }
    public static void main(String[] args) {
        Test a = new Tree();
        a.foo("a");
    }
}

class Tree extends Test {
    public void foo(String a) {
        System.err.println("TREE#foo");
    }
}

Угадайте, что выведется в консоль? Меня интересует вопрос почему именно такой вывод?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
powerOn
Дата 18.10.2007, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Надо было данный вопрос в тему "Маленький тест" написать smile


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
AlexeyVorotnikov
Дата 18.10.2007, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

Репутация: 10
Всего: 18



На первый взгляд должно получиться TREE#foo, но надо проверить...


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
Platon
Дата 18.10.2007, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Если бы было, автор бы не отписывал.
PM MAIL ICQ   Вверх
AlexeyVorotnikov
Дата 18.10.2007, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

Репутация: 10
Всего: 18



А вот фиг вам! Выводится TEST#foo... А вот почему?.. Надо подумать.


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
batigoal
Дата 18.10.2007, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Мда... Royan, молоток. Никогда бы не подумал о подобных граблях.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
mindflyer
Дата 18.10.2007, 08:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

Репутация: 1
Всего: 4



ИМХО. 
Для компилятора здесь нет сравнения приоритетов, ибо в классе Test только одна подходящая функция.
Чтобы заработало иначе, нужно либо создать как
Код

Tree a = new Tree();
// Test a = new Tree();

либо добавить метод void foo(String a) в класс Test
либо 
Код

((Tree)a).foo("a");


В компиляторах слабо разбираюсь, но могу предположить, что в данном случае компилятор в классе Test находит только одну функцию с подходящей сигнатурой, её и прописывает. А вот если вызвать ту же строчку кода но на прикастенном к Tree объекте, он уже будет анализировать обе функции. То же самое, если создать аналогичную функцию в классе Test


Это сообщение отредактировал(а) mindflyer - 18.10.2007, 08:44
PM MAIL ICQ   Вверх
AlexeyVorotnikov
Дата 18.10.2007, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

Репутация: 10
Всего: 18



batigoal, Royan просто к экзамену готовится, поэтому всякие странные вопросы из теста и спрашивает.


mindflyer, абсолютно верно.


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
Platon
Дата 18.10.2007, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Зато какой брейн сторм!!! Молот Royan!!!
PM MAIL ICQ   Вверх
pompei
Дата 19.10.2007, 04:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: 1
Всего: 6



Да действительно так и работает. Но этоже вообще тупой глюк компилятора.
Чё за ерунда:
Пишешь: Test a = new Tree(); Печатается: TEST#foo
Пишешь: Tree a = new Tree(); Печатается: TREE#foo
Лажа какая-то.
Вообще доложно быть так, что выбор метода должен зависеть только от типа объекта, а тут ещё есть зависимость от типа переменной.

--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
jsse
Дата 19.10.2007, 06:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 1.5.2006
Где: Кривой Рог

Репутация: нет
Всего: 2



Это не глюк компилятора, а полиморфизм )

добавить к примеру в класс Tree функцию bar(String a)
вызвать из main() a.bar("a");

Код

public class Test {
    public void foo(String a) {
        System.err.println("TEST#foo");
    }
    public static void main(String ... args) {
        Test a = new Tree();
        a.foo("a");
        a.bar("a");
    }
}
class Tree extends Test {
    public void foo(String ... a) {
        System.err.println("TREE#foo");
    }
    public void bar(String a) {
     foo(a);
    }
}


Такой код даже не скомпилируется, потому что компилятор будет искать метод в классе Test.
PM WWW Skype   Вверх
pompei
Дата 19.10.2007, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: 1
Всего: 6



А да точно, с компилатором всё нормально. jsse! +1

Только всё равно косях с их стороны остаётся: необходимо было предусмотреть такую неоднозначность, например, запрещать компилировать класс Tree из-за того что возникает эта неоднозначность. Т.е. ввести какое-нибудь правило типа: нельзя создавать многоаргументный метод, которому могут подходить родительские методы по спецификации вызова, и нельзя создавать метод, который подходит к какому-нибудь родительскому многоаргументному методу по спецификации вызова.

Вот!

--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
nornad
Дата 19.10.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(pompei @  19.10.2007,  10:09 Найти цитируемый пост)
Только всё равно косях с их стороны остаётся: необходимо было предусмотреть такую неоднозначность, например, запрещать компилировать класс Tree из-за того что возникает эта неоднозначность.

Э... не вижу логики. Почему компилятор должен запретить компиляцию класса, который расширяет уже имеющийся? Я бы в данном случае запрещал компиляцию именно Test, т.к. в его коде идёт попытка вызвать несуществующий метод. Что, в общем-то, и делает компилятор. Мы с ним в этом вопросе выбрали одну точку зрения.  smile 


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
nornad
Дата 20.10.2007, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Что-то у меня появилось непреодолимое желание забанить этого анонимного рекламодателя. smile

Добавлено через 3 минуты и 16 секунд
Хм... это что, новая фишка форума - реклама от гугля в виде ответа в теме?


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
powerOn
Дата 20.10.2007, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



nornad,  тут почитай.

Модератор: В дальнейшем прошу не отклоняться от темы топика.



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0788 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.