2012-03-27 26 views
17

He la siguiente interfaz:Generics: heredan de una clase abstracta que implementa una interfaz

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

tengo la clase abstracta a continuación (que no menciona el inserto método):

public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> { 
} 

tengo la clase concreta:

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

Por último, SpecificEntryBean se define como:

public class SpecificEntryBean extends AbstractEntryBean { 
} 

tengo el siguiente error:

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

No entiendo la razón de este error, dado que se extiende SpecificEntryBean AbstractEntryBean. ¿Cómo soluciono este error?

Respuesta

29

Usted necesita para hacer su clase abstracta genérica así:

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

Luego de su clase concreta:

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

Esta es mi respuesta más favorito en stackoverflow – sector11

3

Cambio a lo siguiente:

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

y

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

El problema es en su declaración de

public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> {} 

Este es el lugar donde se define lo que es tipo de argumento (AbstracEntryBean) para el parámetro de tipo T.

Por lo tanto, T es AbstracEntryBean y cuando pretenda anular este método para implementarlo finalmente, debe proporcionar la firma del método exacto para el método. En este caso:

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

Dado que Java requiere la misma firma de método para anular un método determinado.

Usted puede proporcionar un parámetro de tipo para su clase, como otros han sugerido, o proporcionar un método puente (sobrecarga) de la siguiente manera:

//overloading 
public void insert(SpecificBean object){ 
    insert((AbstractEntryBean) object); 
} 
Cuestiones relacionadas