|
|
|
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 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38637739&tid=2127200]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
182ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 224ms |
| total: | 524ms |

| 0 / 0 |
