views:

127

answers:

1

I made an interface to work with JGraphT. My intended use is like Comparable, in that implementing Comparable allows objects to be used with certain data structures. Simiarly, I have a JGraphT function that I want to work with anything that is Distanceable.

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);
}

Here is my JGraphT function in JGraphtUtilities. It's not defined for Animal, but for 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;
}

But it doesn't work. The compiler produces an error on this line in another class that calls this method:

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

The error is:

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

However,

public class Animal implements Distanceable<Animal> {

What am I doing wrong here?

Another issue: The compiler gives this warning:

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

What type do I want to give it, if I want this function to work with all Distanceable objects?

+2  A: 

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

The method you're displaying in your code sample is graphOfDistances. The problem is with the method graphOfAnimals. So...

Do you have a graphOfAnimals method that takes a Set<Animal> in the JGraphtUtilities class?

JRL
now, but there is a method that takes `Set<Distanceable>`, as shown above.
Rosarch
@Rosarch: see my edit, if there is such a method you didn't display it.
JRL
oh my god. thank you.
Rosarch
The compiler's always right ;-)
JRL
ok - another issue - the compiler wants a type parameter for Distanceable in graphOfDistances(). What do I give it?
Rosarch