Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Как Ява конвертирует выражения и выбирает перегруженные методы ?  [new]
razliv
Member

Откуда:
Сообщений: 1045
Неоднократно сталкивался и не понимаю, как Ява выбирает тип конвертируемого выражения:
1) допустим

System.out.println("123" + 123);

понимает что это выражение "123" + 123 - это String, a ne int/float?

2) Как изо всех перегруженных(overloaded) методов подбирает наиболее подходящий.
System.out.println(String)

Заранее благодарен - если кинете ссылкой rtfm, на эти механизмы.
19 сен 18, 15:55    [21679748]     Ответить | Цитировать Сообщить модератору
 Re: Как Ява конвертирует выражения и выбирает перегруженные методы ?  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 13348
Ну так сначала происходит операция, там все правила изначально установлены: int + int = long, int + string = string и т.д.
Метод после уже вызывается с заведомо известным типом параметра.
19 сен 18, 16:54    [21679816]     Ответить | Цитировать Сообщить модератору
 Re: Как Ява конвертирует выражения и выбирает перегруженные методы ?  [new]
razliv
Member

Откуда:
Сообщений: 1045
Хетт - а где есть такой список для операций, описанный где можно глянуть ? ?

Если скажем System.out.println имеет входной параметр и Object и String,
подаем String - и JVM берет метод для String(а ведь String и есть Object !),
то это значит что всегда подбирает более "полный" метод ?
19 сен 18, 17:04    [21679831]     Ответить | Цитировать Сообщить модератору
 Re: Как Ява конвертирует выражения и выбирает перегруженные методы ?  [new]
Зашедший
Member

Откуда: Москва
Сообщений: 3939
razliv
Хетт - а где есть такой список для операций, описанный где можно глянуть ? ?

Если скажем System.out.println имеет входной параметр и Object и String,
подаем String - и JVM берет метод для String(а ведь String и есть Object !),
то это значит что всегда подбирает более "полный" метод ?

1. Правила неявного приведения описаны в документации Java - https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html
2. Компилятор выбирает не "более полный", а точно соответствующий по сигнатуре метод. Если передали только String, то компилятор ищет метод с единственным параметром типа String. Так же, как в большинстве других языков.
19 сен 18, 17:12    [21679843]     Ответить | Цитировать Сообщить модератору
 Re: Как Ява конвертирует выражения и выбирает перегруженные методы ?  [new]
cossack5
Member

Откуда:
Сообщений: 378
В java 8 например сломали приведение overloading Object к Object[]/varargs из чего некоторые познакомились с таким багом.
20 сен 18, 02:06    [21680203]     Ответить | Цитировать Сообщить модератору
 Re: Как Ява конвертирует выражения и выбирает перегруженные методы ?  [new]
razliv
Member

Откуда:
Сообщений: 1045
Спасибо большое понял как работает :)
20 сен 18, 10:36    [21680414]     Ответить | Цитировать Сообщить модератору
 Re: Как Ява конвертирует выражения и выбирает перегруженные методы ?  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 260
cossack5
В java 8 например сломали приведение overloading Object к Object[]/varargs из чего некоторые познакомились с таким багом.

Помню как Брюс Экел неистовствовал по поводу того КАК внедрили дженерики. Он продвигал вполне здравую мысль, что нужно тут сделать КАК ПОЛОЖЕНо, как например в C++. Пусть даже для этого придется вырезать обратную совместимость с JAVA 1.4 и ниже. И сделать тулузу для перекодирования в "Новую JAVA", для тех кто желает старый код использовать. И вот он вам, еще один привет из прошлого -
автор
Finally, special casing inference with varargs might prove very difficult, because of the same compatibility constraints I've outlined before (i.e. 1.4 clients must be able to see varargs method as plain array-accepting methods)
. И сколько др. проблем с дженериками можно было бы избежать.
Вот скажите, кого сейчас волнует обратная совместимость с JAVA 1.4?

PS Кстати Брюс выпустил новую книжку по JAVA 8 - "On JAVA 8" называется.
21 сен 18, 13:02    [21681908]     Ответить | Цитировать Сообщить модератору
 Re: Как Ява конвертирует выражения и выбирает перегруженные методы ?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7211
IMHO Как сделаны шаблоны в C++ - вообще за гранью добра и зла. Пользоваться этим не возможно. Наверное, мазохисты которые к этому привыкли с детства, этого и не замечают. Но реализовывать шаблоны фактически макроподстановками - это какое-то безумие. На каких галюциногенах сидел Страуструп, когда это родил, то мне не ведомо.

В Java, возможно генерики и "не доделанные", но по крайне мере, в полный маразм как в C++ не скатились

На мой взгляд.
21 сен 18, 13:11    [21681912]     Ответить | Цитировать Сообщить модератору
 Re: Как Ява конвертирует выражения и выбирает перегруженные методы ?  [new]
mayton
Member

Откуда: loopback
Сообщений: 37937
Leonid Kudryavtsev
IMHO Как сделаны шаблоны в C++ - вообще за гранью добра и зла. Пользоваться этим не возможно.

Я бы условно выделил в c++ два подьязыка. Собственно C++ c ООП. И как отдельный слой - процессинг макросов и шаблонов. Причем с логгированием с отладкой последнего.

И сертифицировал бы отдельно.
21 сен 18, 19:31    [21682342]     Ответить | Цитировать Сообщить модератору
 Re: Как Ява конвертирует выражения и выбирает перегруженные методы ?  [new]
cossack5
Member

Откуда:
Сообщений: 378
Пылинка
cossack5
В java 8 например сломали приведение overloading Object к Object[]/varargs из чего некоторые познакомились с таким багом.

Помню как Брюс Экел неистовствовал по поводу того КАК внедрили дженерики. Он продвигал вполне здравую мысль, что нужно тут сделать КАК ПОЛОЖЕНо, как например в C++. Пусть даже для этого придется вырезать обратную совместимость с JAVA 1.4 и ниже. И сделать тулузу для перекодирования в "Новую JAVA", для тех кто желает старый код использовать. И вот он вам, еще один привет из прошлого -

Чтобы бы запилить нормальные дженерики не пришлось бы ломать совместимость - т.е. старый код продолжил работать. Пришлось бы просто добавить параметризованные коллекции (т.е. List<T>, Queue<T> и т.д.), и старые непараметризованные коллекции были бы несовместимы с новыми (так сделали в C#). Т.е. тот кто бы хотел параметризовать коллекции просто бы заимпортил нужный пэкидж (вместо java.util было бы java.util.generic). Но нет бл?*:!, захотели (хз, почему), чтобы старые коллекции продолжали использоваться. Любопытно, что некоторые люди которые там работали (напр. Neal Gafter - здесь он пишет о совместном подвиге) после этого смылись (Neal Gafter ушел делать C#, Одерский ушел делать Scala и т.д.).
21 сен 18, 22:04    [21682413]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить