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