2010-11-26 33 views
8

Je reçois cette erreur dans Eclipse en écrivant une application GWTObtention de l'erreur pour l'interface générique: L'observateur de l'interface ne peut pas être mis en œuvre plus d'une fois avec des arguments différents:

L'observateur de l'interface ne peut pas être mis en œuvre plus d'une fois avec différents arguments: Observer <CompositeListData> et Observer <DialogBoxAuthenticate>

public class CompositeWordLists extends Composite implements Observer<DialogBoxAuthenticate>, Observer<CompositeListData> 

Voici l'interface

public interface Observer<T> { 
    public void update(T o); 
} 

Est-ce exact? Comment puis-je contourner ce problème sans avoir à créer une multitude de classes Observer pour chaque événement possible?

Répondre

3

En raison de l'effacement de type, vous ne pouvez pas implémenter deux fois la même interface (avec des paramètres de type différents). Donc, l'erreur d'éclipse que vous recevez est correcte.

Vous pouvez ajouter une classe de base pour tous les "T" possibles, ce qui peut être limitatif et inutile selon la portée de ces classes. Et, vous avez demandé une solution qui vous empêche de créer une multitude de classes Observer (j'assume des interfaces) pour chaque événement possible, et bien je ne vois pas comment vous pourriez le faire sans compromettre la sécurité du temps de compilation.

Je suggère ce qui suit

interface Observer<T>{ 
    public void update (T o); 
} 

interface DialogBoxAuthenticateObserver extends Observer<DialogBoxAuthenticate>{ 
} 

Le fouillis de code n'est pas horrible et si vous placez le tout dans un seul fichier, ils seront faciles à référencer et à entretenir. Je l'ai aidé espère

EDIT: Après quelques recherches sur Google autour (qui m'a fait revenir à Stackoverflow !, votre question a été posée d'une façon différente et ont répondu de même here

+1

Donc, je viens d'essayer cette solution sur mon problème actuel (presque identique), et cette solution n'a pas fonctionné. – Peaches491

+8

Vous ne pouvez pas faire cela non plus. Vous obtiendrez la même erreur d'interface multiple. – Dzik

0

Composite doit déjà implémenter Observer. Est-ce vraiment ce que je voulais? Vous voulez que cette classe CompositeWordLists observe deux manières à la fois?

0

Je ne sais pas ce qui peut aider, mais Je suis tombé sur le même Java aujourd'hui erreur de compilation

Je partiellement résolu mon cas en extrayant toute la mise en œuvre commune que je pouvais arriver à une classe abstraite paramétrisé.

public enum Example { 
    ; 
    static interface Observer<T> { public void update (T o); } 
    static abstract AbstractObserver<T> implements Observer<T> { 
     public void update (T o) { /* shared stuff I can put here */ } 
    } 
    static Composite extends AbstractObserver<Parameter1> { 
     public void update (T o) { 
      super(o); 
      /* type-specific code here */ 
     } 
    } 
    static CompositeWordLists extends AbstractObserver<Parameter2> { 
     public void update (T o) { 
      super(o); 
      /* type-specific code here */ 
     } 
    } 
}