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
?
Pouvez-vous également nous montrer JGraphtUtilitie. At-il la méthode graphOfAnimals (Set)? –
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? –