2011-01-05 6 views
5

Quiero crear una interfaz que permite a cualquier clase de implementación de esta manera:argumento de entrada interfaz Java se extiende desde una clase base

public interface MyInterface 
{ 

    void doSomething(<A extends MyBaseClass> arg1); 
} 

public class MyImpl implements MyInterface 
{ 
    void doSomething (SomeClassExtendsMyBaseClass arg1) 
    { 
    // do something 
    // SomeClassExtendsMyBaseClass is a class that extends MyBaseClass 
    } 
} 

consigo un error de sintaxis al hacer lo anterior. ¿Puede alguien mostrarme cómo lograr este objetivo?

Gracias

Respuesta

16
public interface MyInterface<A extends MyBaseClass> 
{ 

    void doSomething(A arg1); 
} 

public class MyImpl implements MyInterface<SomeClassExtendsMyBaseClass> 
{ 
    public void doSomething (SomeClassExtendsMyBaseClass arg1) 
    { 
    // do something 
    // SomeClassExtendsMyBaseClass is a class that extends MyBaseClass 
    } 
} 
2

debe ser

<T extends MyBaseClass> void doSomething(T arg1); 
+0

+1 - Esta es la mejor solución si el tipo genérico se limita estrictamente al único método. – Jeremy

+0

No tiene sentido hacer que el método tome un argumento de tipo 'T extiende MyBaseClass' a menos que necesite hacer algo más con' T', como devolver un objeto de tipo 'T' o restringir otro parámetro usando ese tipo . Tal como es, 'void doSomething (MyBaseClass arg1)' sería más apropiado. Además, el OP claramente quiere que las implementaciones de su interfaz puedan restringir el tipo de 'MyBaseClass' que acepta el método; los métodos genéricos permiten a _caller_ especificar el tipo. – ColinD

+0

@Colin: "a menos que necesites hacer algo con' T' "- ¿No es eso lo que quiere el OP? – Jeremy

8

@salexander tiene la solución, pero la razón por la que tiene que hacer esto es que la clase derivada está tratando de ser más específico que no se puede hacer. La razon es la siguiente.

MyInterface mi = new MyImpl(); 
mi.doSomething(new MyOtherClassWhichExtendsMyBaseClass()); 

En la interfaz que dijo que puede tomar cualquier MyBaseClass, así que hay que respetar eso.

En la solución de @salexander, el código sería similar.

MyInterface<SomeClassExtendsMyBaseClass> mi = new MyImpl(); 
mi.doSomething(new MyOtherClassWhichExtendsMyBaseClass()); // compile error. 
+1

+1 para la explicación. – jaydel

Cuestiones relacionadas