2009-09-08 2 views
2

Il y a déjà quelques discussions ici sur stackoverflow sur les génériques Java, mais je suis trop stupide pour résoudre cette question spécifique. J'ai défini une interface dans un projet, et son implémentation dans un autre. Ils sont dans des paquets différents. Au lieu d'implémenter la méthode, le compilateur se plaint dans certains espaces de travail:Eclipse se plaint du conflit de noms si une interface avec une méthode ayant un argument générique est implémentée

Nom clash: La méthode highlight (EnumSet, int, int) de type SuperDuperHighlightable a le même effacement que highlight (EnumSet, int, int) de type IHighlightable mais ne l'outrepasse pas

Le même code ne se plaint pas dans d'autres espaces de travail, et je ne trouve pas les différences pertinentes. Tous les projets et espaces de travail utilisent JRE SE 1.5.

HighlightingStyle.java

package org.my.api; 

public enum HighlightingStyle { 
NONE, FIELD, SELECTION, TEST 
} 

IHighlightable.java

package org.my.api; 

import java.util.EnumSet; 
import javax.swing.text.BadLocationException; 

public interface IHighlightable { 
    void highlight(EnumSet<HighlightingStyle> style, int start, int length) 
    throws BadLocationException, IllegalArgumentException; 
} 

Mise en œuvre:

package org.my.impl; 

import java.util.EnumSet; 
import javax.swing.text.BadLocationException; 
import org.my.api.HighlightingStyle; 
import org.my.api.IHighlightable; 

public class SuperDuperHighlightable implements IHighlightable { 

public void highlight(EnumSet<HighlightingStyle> styleSet, int start, int length) 
    throws BadLocationException, IllegalArgumentException { 
    for (HighlightingStyle style : styleSet) { 
    DoSomething(style, start, length); 
    } 
} 

private void DoSomething(HighlightingStyle style, int start, int length) { 
    // TODO Auto-generated method stub 

} 

} 

Avez-vous des idées si cela est un problème de code source, un problème d'espace de travail ou un problème avec Eclipse?

+0

FYI: Si une question a une réponse définie (ce que je suppose que cette question fait), elle ne devrait PAS être un wiki communautaire. –

+0

Merci, je suis un débutant ici, et je ne pouvais pas encore saisir ce forum-wiki-engine. Puis-je révoquer cette option pour le moment? – wigy

+0

Oui, s'il vous plaît changer, car personne ne gagne la réputation de répondre aux questions de la communauté wiki –

Répondre

3

Pas encore de solution, mais quelques conseils et des tests:

  1. Nettoyer tous les projets dans l'espace de travail, ce qui contribue parfois éclipse des problèmes basés
  2. Assurez-vous que vous avez seulement sur ClassFile « HighlightingStyle » . Peut-être, l'implémentation obtient HighlightingStyle à partir d'une autre source/classloader. Peut-être existe-t-il une bibliothèque sur un chemin de classe qui inclut l'énumération et/ou l'interface
  3. Renommez l'énumération et vérifiez si le refactoring modifie le nom dans l'interface et l'implémentation.

espère que cela aide à résoudre votre problème ..

Modifier

ne se mettaient pas correctement, que cela fonctionne dans certains espaces de travail. Donc je suis sûr, c'est un problème de configuration de l'espace de travail ou peut-être même un bug. À ce stade, personnellement, je ne continuerais pas à corriger ce problème, mais simplement compresser tous les projets en une seule archive, déplacer ou renommer tout l'espace de travail, en créer un nouveau (même nom, lieu d'origine) et importer tous les projets archivés. Si c'est OK, supprimez l'espace de travail déplacé ou renommé.

Bien sûr, vous perdez vos paramètres d'espace de travail, et je ne peux pas dire, si c'est un problème dans votre cas. Je l'ai déjà fait à quelques reprises (j'ai eu un problème avec la subversion et les plugins mercurial ....) et c'est assez facile.

+0

Vérifié toutes vos 3 suggestions sans succès. Clean n'aide pas, j'ai une seule classe nommée HighlightingStyle dans tous les projets, et le refaming de renommer affecte tout le code. L'espace de travail qui n'a pas été compilé ne compile toujours pas. Les espaces de travail qui ont compilé, compilent toujours. – wigy

+0

Tous les nouveaux espaces de travail que j'ai mis en place avec n'importe quelle méthode: ils fonctionnent. J'ai essayé d'isoler le paramètre qui cause le problème dans les anciens espaces de travail - sans succès. Merci pour votre aide, à l'origine je n'étais pas vraiment sûr si le code source était OK. – wigy

1

Je vois que les définitions de classes sont décidément modifiées pour les besoins de la question. Est-ce que l'un ou l'autre prend un type paramétré et que vous ne l'utilisez pas? Si oui, cela pourrait expliquer le problème. J'avais un similar problem, et c'était la cause première.

+0

Oui, le code est simplifié pour les tests. Non, les classes d'origine n'étaient pas génériques. Mon objectif de base est de définir une interface, où l'une des méthodes peut accepter un ensemble de valeurs d'un type d'énumération donné. Assez quelque chose comme un bitfield en C++ ou une énumération avec un attribut [Flags] en C#. Je n'ai tout simplement pas assez d'expérience Java 1.5 pour exprimer cela sans rencontrer les problèmes – wigy

+0

@wigy, pouvez-vous poster les signatures de méthodes réelles exactes où vous avez un problème. Il s'agit probablement d'un problème générique, dans lequel vous avez besoin d'un paramètre extends ou d'un type au bon endroit, et à la place votre interface et votre implémentation définissent deux types génériques différents. Les génériques ne sont pas des variantes, donc cela peut sembler fonctionner, mais pas. – Yishai

+0

Je n'ai pas changé la signature de la méthode highlight. C'était vraiment la même chose dans le code original. Et il n'y avait pas de paramètres de type pour les classes impliquées. Et quand j'ai recréé l'espace de travail avec le même code, il n'y avait pas d'erreur de compilation, donc il me semble qu'il y a eu un problème de configuration ou un bug Eclipse. – wigy

0

Juste eu ce problème aussi. Je l'ai finalement réparé en laissant tomber et en lisant le projet. Ne supprimez pas le contenu sur le disque.

Questions connexes