Generics: Наследование от абстрактного класса, реализующего интерфейс
У меня есть следующий интерфейс:
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 {
}
У меня есть следующая ошибка:
Тип SpecificEntry должен реализовать унаследованный абстрактный метод SingleRecordInterface.insert(AbstractEntryBean)
Я не понимаю причину этой ошибки, учитывая, что SpecificEntryBean расширяет AbstractEntryBean. Как исправить эту ошибку?
Ответы
Ответ 1
Вам также необходимо создать свой абстрактный класс:
public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
}
Затем для вашего конкретного класса:
public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
}
Ответ 2
Измените следующее:
public abstract class AbstractEntry<EB extends AbstractEntryBean> implements SingleRecordInterface<EB> {
}
и
public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
public void insert(SpecificEntryBean entry) {
// stuff
}
}
Ответ 3
Проблема заключается в вашей декларации
public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> {}
Это место, где вы определяете, что такое аргумент типа (AbstracEntryBean) для параметра типа T.
Следовательно, T является AbstracEntryBean
, и когда вы намерены переопределить этот метод для его окончательного внедрения, вам необходимо предоставить точную подпись метода для этого метода. В этом случае:
@Override
public void insert(AbstractEntryBean object) {
// TODO Auto-generated method stub
}
Так как Java требует, чтобы одна и та же сигнатура метода переопределяла данный метод.
Вы можете указать параметр типа для своего класса, как предложили другие, или предоставить метод переадресации (перегрузки) следующим образом:
//overloading
public void insert(SpecificBean object){
insert((AbstractEntryBean) object);
}
Ответ 4
public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
}
public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
public void insert(SpecificEntryBean entry) {
// stuff
}
}