2010-12-12 21 views
10

Consideremos el siguiente ejemplo:¿No se puede incluir la misma interfaz con diferentes parámetros?

public class Sandbox { 
    public interface Listener<T extends JComponent> { 
     public void onEvent(T event); 
    } 

    public interface AnotherInterface extends Listener<JPanel>, Listener<JLabel> { 
    } 
} 

Esto se produce el siguiente error

/media/PQ-WDFILES/programming/Sandbox/src/Sandbox.java:20: Sandbox.Listener cannot be inherited with different arguments: <javax.swing.JPanel> and <javax.swing.JLabel> 
     public interface AnotherInterface extends Listener<JPanel>, Listener<JLabel> { 
      ^
1 error 

Por qué sin embargo? No hay superposición en los métodos generados. De hecho, eso significa esencialmente

public interface AnotherInterface { 
    public void onEvent(JPanel event); 
    public void onEvent(JLabel event); 
} 

No hay superposición allí. Entonces, ¿por qué está fallando?


En caso de que su preguntando lo que estoy haciendo y tener una mejor solución: Tengo un montón de eventos y una interfaz de escucha que es casi exactamente igual que la clase Listener anteriormente. Estoy queriendo crear un adaptador y una interfaz de adaptador, y para eso necesito extender todas las interfaces de Listener con un evento específico. es posible? ¿Hay una mejor manera de hacer esto?

Respuesta

10

No. Usted no puede. Se debe a que los genéricos solo son compatibles a nivel de compilador. Por lo que no puede hacer piensa como

public interface AnotherInterface { 
    public void onEvent(List<JPanel> event); 
    public void onEvent(List<JLabel> event); 
} 

o implementa la interfaz con varios parámetros.

UPD

creo solución será la siguiente:

public class Sandbox { 
// .... 
    public final class JPanelEventHandler implements Listener<JPanel> { 
     AnotherInterface target; 
     JPanelEventHandler(AnotherInterface target){this.target = target;} 
     public final void onEvent(JPanel event){ 
      target.onEvent(event); 
     } 
    } 
///same with JLabel 
} 
+0

Ah, me olvidé de borrado de tipo. ¿Conoces una forma alternativa de lograr lo que quiero hacer? – TheLQ

+0

@TheLQ, actualizado. –

+0

@Stas Parece una tonelada de código por evento (~ 50). Tal vez debería volver a la creación explícita de oyentes por evento? – TheLQ

3

No olvide que en java genéricos se implementan utilizando tipo errata, pero la extensión permanece después de la compilación.

Así que lo que está pidiendo el compilador de hacer (después del tipo de borrado es),

public interface AnotherInterface extends Listener, Listener; 

que simplemente no se puede hacer o no genéricos.

+0

que se olvidó de tipo borrado. ¿Conoces una forma alternativa de lograr lo que quiero lograr? – TheLQ

+0

clase 'Uno implementa dos, tres {} interfaz Otro {} interfaz Dos extiende Otro {} interfaz Tres extiende Otro {}' - Cambie una 'Object' a cualquier otra cosa y obtienes el error. Por lo tanto, no es porque amplíe la interfaz por duplicado, y sí tiene que ver específicamente con Generics. – Nicole

Cuestiones relacionadas