2012-03-27 2 views
17

я следующий интерфейс:Непатентованные: Наследование от абстрактного класса, который реализует интерфейс

public interface SingleRecordInterface<T> { 
    public void insert(T object); 
} 

У меня есть абстрактный класс ниже (т.е. не упоминает метод вставки):

public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> { 
} 

у меня есть конкретный класс:

public class SpecificEntry extends AbstractEntry { 
    public void insert(SpecificEntryBean entry) { 
     // stuff 
    } 
} 

Наконец, SpecificEntryBean определяется как:

public class SpecificEntryBean extends AbstractEntryBean { 
} 

У меня есть следующее сообщение об ошибке:

The type SpecificEntry must implement the inherited abstract method SingleRecordInterface.insert(AbstractEntryBean)

я не понимаю причину этой ошибки, учитывая, что SpecificEntryBean расширяет AbstractEntryBean. Как исправить эту ошибку?

ответ

29

Вы должны сделать свой абстрактный класс родовое, а также:

public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> { 
} 

Тогда для конкретного класса:

public class SpecificEntry extends AbstractEntry<SpecificEntryBean> { 
} 
+1

Это мой самый любимый ответ на StackOverflow – sector11

3

Изменение к следующему:

public abstract class AbstractEntry<EB extends AbstractEntryBean> implements SingleRecordInterface<EB> { 
} 

и

public class SpecificEntry extends AbstractEntry<SpecificEntryBean> { 
    public void insert(SpecificEntryBean entry) { 
     // stuff 
    } 
} 
1
public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> { 
} 

public class SpecificEntry extends AbstractEntry<SpecificEntryBean> { 
    public void insert(SpecificEntryBean entry) { 
     // stuff 
    } 
} 
2

Проблема заключается в вашем объявлении

public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> {} 

Это место, где вы определяете, что аргумент типа (AbstracEntryBean) для параметра типа T.

Следовательно, Т AbstracEntryBean , и когда вы намерены переопределить этот метод для его окончательного внедрения, вам необходимо предоставить точную подпись метода для этого метода. В этом случае:

@Override 
public void insert(AbstractEntryBean object) { 
    // TODO Auto-generated method stub 
} 

Поскольку Java требует, чтобы та же самая сигнатура метода переопределяла данный метод.

Вы можете либо указать параметр типа для класса, как другие полагают, или предоставить метод моста (перегрузка) следующим образом:

//overloading 
public void insert(SpecificBean object){ 
    insert((AbstractEntryBean) object); 
} 
Смежные вопросы