web-dev-qa-db-fra.com

Génériques: héritant d'une classe abstraite qui implémente une interface

J'ai l'interface suivante:

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

J'ai la classe abstraite ci-dessous (qui ne mentionne pas l'insertion de méthode):

public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> {
}

J'ai la classe concrète:

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

Enfin, SpecificEntryBean est défini comme:

public class SpecificEntryBean extends AbstractEntryBean {
}

J'ai l'erreur suivante:

Le type SpecificEntry doit implémenter la méthode abstraite héritée SingleRecordInterface.insert (AbstractEntryBean)

Je ne comprends pas la raison de cette erreur, étant donné que SpecificEntryBean étend AbstractEntryBean. Comment puis-je corriger cette erreur?

20
Matt

Vous devez également rendre votre classe abstraite générique:

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

Alors pour votre cours de béton:

public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
}
35
Alex

Modifiez ce qui suit:

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

et

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

Le problème réside dans votre déclaration de

public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> {}

C'est l'endroit où vous définissez quel est l'argument de type (AbstracEntryBean) pour le paramètre de type T.

Par conséquent, T est AbstracEntryBean, et lorsque vous avez l'intention de remplacer cette méthode pour finalement l'implémenter, vous devez fournir la signature de méthode exacte pour la méthode. Dans ce cas:

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

Puisque Java nécessite la même signature de méthode exacte pour remplacer une méthode donnée.

Vous pouvez soit fournir un paramètre de type pour votre classe, comme d'autres l'ont suggéré, soit fournir une méthode de pontage (surcharge) comme suit:

//overloading
public void insert(SpecificBean object){
  insert((AbstractEntryBean) object);
}
2
Edwin Dalorzo
public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
}

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