2012-03-27 18 views
17

Mam następujący interfejs:rodzajowych: dziedziczenie z klasy abstrakcyjnej, która implementuje interfejs

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

mam klasa abstrakcyjna poniżej (czyli nie wspomina metody insert):

public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> { 
} 

Mam konkretną klasę:

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

Wreszcie, SpecificEntryBean jest zdefiniowany jako:

public class SpecificEntryBean extends AbstractEntryBean { 
} 

mam następujący błąd:

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

Nie rozumiem przyczynę tego błędu, zważywszy, że SpecificEntryBean rozciąga AbstractEntryBean. Jak naprawić ten błąd?

Odpowiedz

29

Trzeba dokonać abstrakcyjnej klasy rodzajowe, a także:

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

Potem do konkretnej klasy:

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

To moja najbardziej ulubiona odpowiedź w stackoverflow – sector11

3

zmieni się na następujący:

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

i

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

Problem jest w swojej deklaracji

public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> {} 

Jest to miejsce, gdzie można zdefiniować, co jest argumentem typu (AbstracEntryBean) dla parametru typu T.

Dlatego T AbstracEntryBean , a kiedy zamierzasz zastąpić tę metodę, aby ją ostatecznie wdrożyć, musisz podać dokładny podpis metody dla tej metody. W tym przypadku:

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

Ponieważ Java wymaga podpisu tej samej metody do nadpisania danej metody.

Można też dostarczyć parametr typu dla swojej klasy, jak inni sugerują, lub dostarczenie sposobu most (przeciążenie) w następujący sposób:

//overloading 
public void insert(SpecificBean object){ 
    insert((AbstractEntryBean) object); 
} 
Powiązane problemy