|
|
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
такой вот код. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. очевидно, что он не компилится. Но смущает то, что выдает компилятор: авторjava: m(java.lang.Number) in inheritanceTest.B cannot override m(java.lang.Number) in inheritanceTest.A return type int is not compatible with void Для меня override это полиморфизм... нет же никакого полиморфизма для статических методов. Ведь это же overloading. или jls как то по другому определяет override или ещё что-то я не понимаю - разъясните. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 01:13 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
LS §8.4.8.3 (Java 8) says: автор If a method declaration d1 with return type R1 overrides or hides the declaration of another method d2 with return type R2, then d1 must be return-type-substitutable (§8.4.5) for d2, or a compile-time error occurs. Круто) компилятор по ходу работает абсолютно как jls) а вот то, что в сообщение они забыли дописать слово hide - печально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 01:42 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Сокрытие - это переопределение метода с точно такой же сигнатурой. Ваш случай, вообще говоря, именно перекрытие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 11:51 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Basil A. Sidorovперекрытие hides? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 12:32 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
questionerhides?override (overload). P.S. Почему плохо сочетать статику и полиморфизм - рассмотрено в "(Most) Effective C++". Выводы - вполне универсальны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 15:01 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovquestionerhides?override (overload). Хотите сказать, что jls не различаети override и overload? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 15:14 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, и всё таки это hiding jlsIf a subclass defines a static method with the same signature as a static method in the superclass, then the method in the subclass hides the one in the superclass. http://docs.oracle.com/javase/tutorial/java/IandI/override.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 18:37 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
questionerи всё таки это hidingДля компилятора сигнатура включает всё. И тип возвращаемого значения в том числе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 19:02 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, читаем, что пишут в jls: jlsTwo methods have the same signature if they have the same name and argument types. http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 20:34 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
questioner , Вы привели выдержку из спецификации языка . А Basil A. Sidorov говорит о том, как на такие конструкции реагирует компилятор . Это разные вещи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 21:20 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
DEVcoach questioner , Вы привели выдержку из спецификации языка . А Basil A. Sidorov говорит о том, как на такие конструкции реагирует компилятор . Это разные вещи. jlsIf a subclass defines a static method with the same signature as a static method in the superclass, then the method in the subclass hides the one in the superclass. jlsTwo methods have the same signature if they have the same name and argument types. вы считаете, что jls в одном месте определяет что такое равенство сигнатур метода, а в другом месте использует другое значение для этого термина? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 21:27 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovquestionerи всё таки это hidingДля компилятора сигнатура включает всё. И тип возвращаемого значения в том числе. я ж не говорю,что это неправда - я реально не знаю, но ведь это абсолютно никак не относится к делу. Выражайте пожалуйста мысли целиком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 21:29 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
questionerя ж не говорю,что это неправда - я реально не знаю, но ведь это абсолютно никак не относится к делу. Выражайте пожалуйста мысли целиком.Я считаю, что приведённый пример - перегрузка, а не сокрытие. К делу это действительно не относится и скрывать/перегружать методы класса (статические методы) - не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 08:14 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, давайте разберемся overloading: jlsIf two methods of a class (whether both declared in the same class, or both inherited by a class, or one declared and one inherited) have the same name but signatures that are not override-equivalent, then the method name is said to be overloaded. hiding: jlsIf a class C declares or inherits a static method m, then m is said to hide any method m', where the signature of m is a subsignature (§8.4.2) of the signature of m', in the superclasses and superinterfaces of C that would otherwise be accessible to code in C. Помогайте))) Я не совсем уверен, но для меня это выглядит, что hiding это часть overloading-а для статических методов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 12:37 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Так, попробуем собрать всё воедино: jlsTwo methods have the same signature if they have the same name and argument types jls The signature of a method m1 is a subsignature of the signature of a method m2 if either: m2 has the same signature as m1, or the signature of m1 is the same as the erasure (§4.6) of the signature of m2. Two method signatures m1 and m2 are override-equivalent iff either m1 is a subsignature of m2 or m2 is a subsignature of m1. jlsIf two methods of a class (whether both declared in the same class, or both inherited by a class, or one declared and one inherited) have the same name but signatures that are not override-equivalent, then the method name is said to be overloaded. вернемся к первому примеру: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. у нас тут two methods of a class (whether both declared in the same class, or both inherited by a class, or one declared and one inherited) have the same name but signatures that are not override-equivalent , then the method name is said to be overloaded.[/quote] are not override-equivalent - у нас явно override-equivalent ! Мне кажется придётся Вам всё-таки согласиться, что это не overloading) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 13:11 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Хорошо. Переопределение статического метода в классе-потомке скрывает метод с аналогично сигнатурой в классе предке. Согласен. Нежелательность такого сокрытия - остаётся в силе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 13:17 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Basil A. SidorovНежелательность такого сокрытия - остаётся в силе. Да, конечно, в жизни нежелательно так делать) Тут был вопрос на синтаксис ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 13:23 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
redwhite90Тут был вопрос на синтаксисА мне показалось, что придирка с сообщению компилятора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 13:45 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Всё таки, зря согласился: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Результат: Код: plaintext 1. Компилятор учитывает полную сигнатуру метода, включая возвращаемое значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 14:01 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Аксиома: разработчики компиляторов и прочих инструментальных средств разбираются в спецификации языка лучше, чем прикладные программисты. Следствие: прикладной программист должен знать синтаксис и стандартную библиотеку. JLS - только в качестве развлечения :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 14:06 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Basil A. SidorovА мне показалось, что придирка с сообщению компилятора компилятор должен соответствовать jls) это тоже аксиома. Basil A. Sidorov,Вывод: компилятор запрещает перегрузку не вижу как этот демонстрируется в ващем примере. автор но допускает сокрытие для статических. Компилятор учитывает полную сигнатуру метода, включая возвращаемое значение. да, допускает. Если всё упростить и по русски, то у меня в голове сейчас следующее понимание. перегрузка это когда у нас одинаковое имя у метода, но разный список параметров. Всё иное - не есть перегрузка. hiding это по синтаксису то же самое, что и overriding только для статических методов. Как мы знаем, что при overriding сигнатура(в терминах jls) должна сохраниться(как я понял из описания с учётом erasure, но это не наш случай, так что не будем об этом) возвращаемое значение должно быть ковариантно, throws <= чем у родителя и видимость >= чем у родителя. Всё сходится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 16:09 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Так, да не совсем: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. Разница между перегрузкой и сокрытием видна только при наследовании: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Допускается сокрытие реализации, если методы совпадают по списку аргументов, а типы возвращаемых значений совместимы по иерархии наследования. "Статичность" метода влияет только на способ выбора реализации: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 16:57 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 16:59 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, вроде всё так написали. я согласен. почему? Basil A. SidorovТак, да не совсем: на hiding вроде как действуют те же самые правила, что на overriding. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 17:57 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Ёршвашумедь ... Таблица методов класса не может содержать два метода с идентичным списком аргументов и разными типами возвращаемого значения. Потому что неопределённость. Поэтому таблица методов может вообще не хранить возвращаемые типы. Что приводит нас к формулировке "(только) список аргументов". Но! Если класс-потомок скрывает метод родительского класса, то в таблице его методов скрывающий метод будет прописан в той же точке таблицы, что и скрываемый метод родительского класса. Именно поэтому используется термин "сокрытие". В результата, если скрывающий метод будет возвращать тип, который не совместим по присваиванию с типом скрываемого метода - получаем нарушение интерфейса класса. У предка метод, возвращающий определённый тип был, а у потомка такой метод, внезапно, исчез. Так вот, в этой ситуации компилятор выдаёт сообщение о некорректном перекрытии метода и термин перекрытие - истинная правда. Статичность в этой ситуации - совершенно побоку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 18:14 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, я вас понял, интересный взгляд) статичность здесь причем потому, что она позволяет создать такую ситуацию. Как я понимаю по-иному эту ситуацию и не получить. Поправьте если что Basil A. Sidorovтип, который не совместим по присваиванию с типом скрываемого метода Что скажете насчёт: Код: java 1. 2. 3. 4. 5. 6. 7. авторjava: m(java.lang.Number) in inheritanceTest.B cannot override m(java.lang.Number) in inheritanceTest.A return type long is not compatible with int ------------------------------------------------- Код: java 1. 2. 3. 4. 5. 6. 7. авторjava: m(java.lang.Number) in inheritanceTest.B cannot override m(java.lang.Number) in inheritanceTest.A return type long is not compatible with int ------------------------------ Код: java 1. 2. 3. 4. 5. 6. 7. 8. авторMain.java:20: error: m(Number) in B cannot override m(Number) in A public static int m(Number n){System.out.println("Number B");return 1;}; ^ return type int is not compatible with Integer ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 20:04 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Могу только повторить - компилятор не может перекрыть метод из-за несовместимых по присваиванию типов возвращаемых результатов. То, что таблица статических методов существует только на этапе компиляции, никак не меняет ситуацию с нарушением интерфейса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 20:20 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, ну тогда напрашивается очевидный вопрос - что такое совместимость по присваиванию? Код: java 1. 2. 3. - ведь работает.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 20:24 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
redwhite90ну тогда напрашивается очевидный вопрос - что такое совместимость по присваиваниюЯ был неточен, а вы - невнимательны. Сокрытие может произойти только при наследовании, поэтому не "по присваиванию", а "по наследованию" - те самые ковариантные тип. У примитивов нет иерархии наследования и тип должны совпадать в точности. P.S. Я ведь не зря именно такой пример привёл: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 20:46 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Basil A. Sidorovне "по присваиванию", а "по наследованию" о том и речь. а какая связь с примером то? Компилируя в уме полагаю, что в случае НЕ статик. трижды выведено class B в случае статик class A class B class A вот слово ковариантность меня всегда пугала...когда-то я думал, что это аналог слова "приводимость" Но как оказалось нет и вообще по отношению к java не уверен, что стоит его понимать. Если оно только для override/hide методов используется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 21:08 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
redwhite90а какая связь с примером то?В (вашем) примере придирка к слову override - вы считаете, что должно быть hide. Я считаю, что компилятор совершенно законно использует override, т.к. имеет место быть попытка перегрузки интерфейса класса. Попытка, нарушающая правила наследования. P.S. А компилируете вы правильно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 21:14 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
redwhite90вот слово ковариантность меня всегда пугала...когда-то я думал, что это аналог слова "приводимость" Но как оказалось нетВы как-то пугаете способностью делать странные выводы из верных предпосылок ... С чего вдруг "нет"??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 21:16 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Basil A. SidorovС чего вдруг "нет"??? потому, что int приводим к long но не ковариантен ему! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 21:25 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
redwhite90потому, что int приводим к long но не ковариантен ему!Вы продолжаете пугать. Ковариантность относится исключительно к объектам. Только у них есть иерархия наследования. Примитивы не являются объектами. У них нет иерархии наследования. К ним не относится понятие ковариантности. Хотите рассматривать числовые объекты - выбирайте правильное дерево . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 21:39 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, приводимость бывает для объектов и для примитивов ---для объектов она называется ковариантность ---для примитов хрен знает как она называется следовательно приводимость =! ковариантность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 21:47 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Basil A. SidorovВ (вашем) примере придирка к слову override - вы считаете, что должно быть hide. Я считаю, что компилятор совершенно законно использует override, т.к. имеет место быть попытка перегрузки интерфейса класса. Попытка, нарушающая правила наследования для override и hide даже правила вместе написаны. Так и называется раздел - правила для override and hide. Ну я думаю, что тут уже наш спор себя исчерпал) хотелось бы услышать третью сторону ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 21:51 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, авторНу я думаю, что тут уже наш спор себя исчерпал имеется ввиду по поводу overide/hide только ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 22:01 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
redwhite90приводимость бывает для объектов и для примитивов ---для объектов она называется ковариантность ---для примитов хрен знает как она называется следовательно приводимость =! ковариантностьВнимательно посмотрите на вторую и последнюю строки. Осознайте, что вы противоречите сами себе. Правила совместимости по присваиванию для примитивов определяет язык, для объектов - иерархия наследования. Так что в контексте объектов "совместимость по присваиванию", она же "приводимость", она же "ковариантность" - эквивалентны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 22:18 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Basil A. SidorovТак что в контексте объектов "совместимость по присваиванию", она же "приводимость", она же "ковариантность" - эквивалентны. только в контексте объектов! для меня равенство это величина абсолютная во всех контекстах то же самое сказать, что Object == String. String это Object, НО наоборот неверно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 22:30 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
redwhite90только в контексте объектов! для меня равенство это величина абсолютная во всех контекстахГде, пусть даже "только в контексте объектов" вы усмотрели "равенство" применительно к терминам "приводимость (по иерархии наследования)", "совместимость (по присваиванию)", "ковариантность (объектных типов)"??? Все три термина оперируют с ориентированным ацикличным графом (иерархией наследования). Коммутативность (арифметической) операции сравнения на таком графе не выполняется. Вы уж, как-то, умерьте осетра категоричности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 23:37 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, вы сначала сами сказали, что ВыТак что в контексте объектов "совместимость по присваиванию", она же "приводимость", она же "ковариантность" - эквивалентны. потом я ответил: автортолько в контексте объектов! потом Вы: Basil A. SidorovГде, пусть даже "только в контексте объектов" вы усмотрели "равенство" применительно к терминам "приводимость (по иерархии наследования)", "совместимость (по присваиванию)", "ковариантность (объектных типов)"??? как так то? я лишь сказал, что яприводимость =! ковариантность ну то же самое если вас спросят List и LinkedList это одно и то же что вы ответите ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 23:53 |
|
||
|
overriding Vs overloading
|
|||
|---|---|---|---|
|
#18+
redwhite90ну то же самое если вас спросят List и LinkedList это одно и то же что вы ответите ?А вы не смешивайте "приводимость" и "равенство". byte приводим к int, но не равен ему. При этом int не приводим к byte, т.к. для неявных преобразований типов вводится запрет на (возможную) потерю данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2014, 10:48 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2127200]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
170ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 448ms |

| 0 / 0 |
