|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Слегка оффтоп.
Мне вот тоже не нравится такая позиция с оверрайдами и интерфейсами. Ну с оверрайдом то логически более понятно, и я тут больше согласен чем нет. А в интерфейсе хотелось бы побольше гибкости. Банально потому что в интерфейсе я хочу описать нечто сравнительно абстрактное, а при реализации уже использовать реальные классы проекта. Ан нет, не получится по той же причине что и оверрайд. Такое, больше на судьбу пожаловался нежели конструктив, но вдруг есть решения вопроса - то готов услышать обсудить. //********************* А по теме таки да. Ну оверрайд это значит перезаписать метод. Это значит оставить метод "as is" но поменять его реализацию. А другие типы принимаемые или возвращаемые - это уже будет не "as is" а нечто другое. Соответственно компилятор и ругается.
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
хотите абстракций пользуйте интерфейсы, они для этого и придуманы
|
|
|||||
Цитата:
Убого же. Почему именно нельзя - я так и не понял. Ответ частично получен, можно закрывать.
__________________
Дебаггер не предлагать |
|
|||||
Цитата:
Но иногда это жутко неудобно.
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
Modus ponens
|
Эта проблема похожа на проблему инвариантности коллекций с родовым ковариантным параметром. Т.е. A<extends B> не является подтипом A<B>. Не смотря на то, что определенное родство между ними есть. Но мне как-то тяжело придумать пример, когда и в чем это проявляется. Тут вод недавно статья попадалась, может пригодится:
http://blogs.msdn.com/b/ruericlipper...atibility.aspx
__________________
Hell is the possibility of sanity |
|
|||||
Регистрация: Nov 2010
Сообщений: 497
|
Цитата:
final List<A> la = new ArrayList<A>(); final List<B> lb = la; //A extends B, при ковариантности присваивание возможно lb.add(new B()); // сигнатура позволяет final A a= la.get(0); // Что должно быть здесь? Исходный же вопрос (уточнение типов) обычно никаких проблем не создает. Обычно допускается уточнять тип результата, убирать лишние исключения (это в Java поддерживается). Без overloading'а (в AS) можно было бы еще позволить типы аргументов более общими делать (вместо B дать его родителя A). Могут быть проблемы при полиморфизме по return type, но это далеко не все языки (а там, где он есть, система типов совсем другая) и точно не AS. |
|
|||||
Modus ponens
|
Если бы в Яве были нормальные генерики, это бы загнулось уже на lb.add()... но это такое Статический полиморфизм - наше все.
Собственно, если у нас есть метод, то у нас есть его тип выведенный как: A->B->C где, для простоты, A - тип this, B - тип аргумента, C - тип возвращаемого значения. Когда этот метод унаследовался, то мы уже его представляем как: A'->B->C И он ковариантен по первому типу. A'->B'->C можно считать совместимым по присваиванию, но, на сколько я понимаю, в общем случае, ковариантность не гарантируется.
__________________
Hell is the possibility of sanity |
|
|||||
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
|
Цитата:
Любой SomeOtherClass является одновременно и SomeClass, но SomeClass не обязательно является SomeOtherClass. Грубо говоря, если вы используете оверрайд геттера, а не называете его по другому, то подразумевается, что на месте используемого объекта может быть как экземпляр SomeClass, так и SomeOtherClass, поэтому сигнатура возвращаемых типов должна совпадать. |
Часовой пояс GMT +4, время: 16:52. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|