Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Overriding generified methods


Автор: taro 28.3.2008, 12:50
Добрый день!
При попытке пометить метод в потомке как  @Oerride получаю сообщение об ошибке
Мне казалось, что если в потомке при описании параметров метода указать класс, подходящий под определение базового метода в родителе, то проблем быть не должно. 
Не поможете ли понять, в чем может быть дело? 

Код

Класс-предок 
    public <T extends SimpleEntity> void  fillFields(T ent, Session ses){
        throw new Error("called  method 'fillFields' is not implemented");
    };

Класс-потомок
    public void fillFields(SoftBlock ent, Session ses){....}        

Описание класса 
    public class SoftBlock extends SimpleEntity{..}


Спасибо!

Автор: LSD 28.3.2008, 13:24
Так он его и не переопределяет smile Вот если бы ты написал:
Код

public void fillFields(SimpleEntity ent, Session ses)

тогда да, он бы его переопределял, а так нет. 

Дело в том, что метод в предке принимает любой класс SimpleEntity, а в потомке только SoftBlock, т.е. ситуация получается похожая на:
Код

class A
{
  public void foo(Object o)
  {}
}

class B extends A
{
  public void foo(String s)
  {}
}

тут тоже никто никого не переопределяет.

Автор: taro 28.3.2008, 13:35

Цитата(LSD @  28.3.2008,  13:24 Найти цитируемый пост)
тут тоже никто никого не переопределяет. 

В вашем примере именно override и происходит. Согласно JLS можно унаследовать метод, изменив параметр / возвращаемое значение на класс, являющийся предком класса, использованного в методе-предке. 

Все равно спасибо, у меня, наверное, уже горе от ума начинается. 

Автор: LSD 28.3.2008, 13:42
Цитата(taro @  28.3.2008,  13:35 Найти цитируемый пост)
Согласно JLS можно унаследовать метод, изменив параметр / возвращаемое значение на класс, являющийся предком класса, использованного в методе-предке.

Ссылку в студию smile

Автор: taro 28.3.2008, 14:08
Цитата(LSD @  28.3.2008,  13:42 Найти цитируемый пост)
Ссылку в студию

пруфлинк реквайред? 

http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.5


Автор: Kangaroo 28.3.2008, 14:23
Цитата(taro @  28.3.2008,  12:35 Найти цитируемый пост)
В вашем примере именно override и происходит.

Overload там обычный, не путайте людей smile 

Автор: taro 28.3.2008, 14:27
Цитата(Kangaroo @  28.3.2008,  14:23 Найти цитируемый пост)
Overload там обычный, не путайте людей smile  


Вынужден путать. Цитата 8.4.8.3: 

Цитата

The rules above allow for covariant return types - refining the return type of a method when overriding it.

Автор: fixxer 28.3.2008, 14:36
Цитата(taro @ 28.3.2008,  14:27)
Цитата(Kangaroo @  28.3.2008,  14:23 Найти цитируемый пост)
Overload там обычный, не путайте людей smile  


Вынужден путать. Цитата 8.4.8.3: 

Цитата

The rules above allow for covariant return types - refining the return type of a method when overriding it.

а причем тут return type? Это да, при переопределении метода в потомке, у нас есть право сузить возвращаемый тип, но причем тут аргументы метода?

Автор: Kangaroo 28.3.2008, 14:39
Цитата(fixxer @  28.3.2008,  13:36 Найти цитируемый пост)
Это да, при переопределении метода в предке у нас есть право сузить возвращаемый тип, но причем тут аргументы метода?

Вот, вот  smile 

Автор: taro 28.3.2008, 14:41
Цитата(fixxer @  28.3.2008,  14:36 Найти цитируемый пост)
а причем тут return type? Это да, при переопределении метода в потомке, у нас есть право сузить возвращаемый тип, но причем тут аргументы метода?

Мне кажется, при том, что замена сигнатуры принимаемых параметров - епархия перегрузки. Замена возвращаемого типа - епархия covariant return. 

Автор: Kangaroo 28.3.2008, 14:53
Цитата(taro @  28.3.2008,  13:41 Найти цитируемый пост)
Мне кажется, при том, что замена сигнатуры принимаемых параметров - епархия перегрузки. Замена возвращаемого типа - епархия covariant return.  

Все правильно. Тогда почему ты говоришь, что пример LSD - override? если там замена сигнатуры принимаемых параметров 

Автор: fixxer 28.3.2008, 14:57
Цитата(taro @ 28.3.2008,  14:41)
Цитата(fixxer @  28.3.2008,  14:36 Найти цитируемый пост)
а причем тут return type? Это да, при переопределении метода в потомке, у нас есть право сузить возвращаемый тип, но причем тут аргументы метода?

Мне кажется, при том, что замена сигнатуры принимаемых параметров - епархия перегрузки. Замена возвращаемого типа - епархия covariant return.

Что и написано в цитируемом Вами пункте. Про "замену сигнатуры принимаемых параметров" там ни слова.

Автор: taro 28.3.2008, 15:21
Цитата(fixxer @  28.3.2008,  14:57 Найти цитируемый пост)
то и написано в цитируемом Вами пункте. Про "замену сигнатуры принимаемых параметров" там ни слова. 

А я и не говорил с вами о принимаемых параметрах. 
тему вообще можно закрыть. Меня ввел в заблуждение очередной глюк Эклиспса. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)