2009-12-02 9 views
0

J'ai créé une interface pour travailler avec JGraphT. Mon utilisation prévue est similaire à Comparable, en ce que l'implémentation Comparable permet d'utiliser des objets avec certaines structures de données. Similairement, j'ai une fonction JGraphT que je veux travailler avec tout ce qui est Distanceable.Java: Problème simple avec les interfaces et les génériques

public interface Distanceable<E> { 

    /** 
    * A representation of the distance between these two objects. 
    * If the distance between a0 and a1 is undefined, <code>a0.hasEdge(a1)</code> should return false; 
    * @param o 
    * @return 
    */ 
    public int distance(E o); 

    /** 
    * Are these two objects connected? 
    * @param o 
    * @return True if the two objects are connected in some way, false if their distance is undefined 
    */ 
    public boolean hasEdge(E o); 
} 

Voici ma fonction JGraphT dans JGraphtUtilities. Il est pas défini pour Animal, mais pour Distanceable:

public static <E extends Distanceable> WeightedGraph<E, DefaultWeightedEdge> graphOfDistances(Set<E> nodes) { 
    WeightedGraph<E, DefaultWeightedEdge> g = new SimpleWeightedGraph<E, DefaultWeightedEdge>(DefaultWeightedEdge.class); 

    for (E a : nodes) { 
     g.addVertex(a); 
    } 

    for (E a : nodes) { 
     for (E a1 : nodes) { 
      if (a.hasEdge(a1)) { 
       g.addEdge(a, a1); 
       g.setEdgeWeight(g.getEdge(a, a1), a.distance(a1)); 
      } 
     } 
    } 

    return g; 
} 

Mais cela ne fonctionne pas. Le compilateur produit une erreur sur cette ligne dans une autre classe qui appelle cette méthode:

WeightedGraph<Animal, DefaultWeightedEdge> graphOfAnimals = JGraphtUtilities.graphOfAnimals(zoo); 

L'erreur est:

The method graphOfAnimals(Set<Animal>) is undefined for the type JGraphtUtilities 

Cependant,

public class Animal implements Distanceable<Animal> { 

Qu'est-ce que je fais mal ici?

Une autre question: Le compilateur donne cet avertissement:

Distanceable is a raw type. References to generic type Distanceable<E> should be parameterized. 

Quel type que je veux donner, si je veux que cette fonction fonctionne avec tous les objets Distanceable?

+1

Pouvez-vous également nous montrer JGraphtUtilitie. At-il la méthode graphOfAnimals (Set )? –

+0

La méthode que vous avez incluse est appelée graphOfDistances (Set nodes) et non graphOfAnimals (Set ). Attendez-vous que le compilateur devine la méthode que vous vouliez réellement appeler? –

Répondre

2

La méthode graphOfAnimals(Set<Animal>) est pas défini pour le type JGraphtUtilities

La méthode que vous affichiez dans votre exemple de code est graphOfDistances. Le problème est avec la méthode graphOfAnimals. Donc ...

Avez-vous une méthode graphOfAnimals qui prend un Set<Animal> dans la classe JGraphtUtilities?

+0

maintenant, mais il existe une méthode qui prend 'Set ', comme indiqué ci-dessus. –

+0

@Rosarch: voir mon edit, s'il y a une telle méthode, vous ne l'avez pas affichée. – JRL

+0

oh mon dieu. Je vous remercie. –

Questions connexes