我已经实例化了这样的对象:

GraphMatrixDirected<String, Integer> g


g传递给这样的函数:

floyd(g);


floyd的签名如下所示:

public void floyd(GraphMatrixDirected<V,E> g)


Eclipse给我一个错误,说:

The method floyd(GraphMatrixDirected<V,E>) in the type GraphMatrix<V,E> is not applicable for the arguments (GraphMatrixDirected<String,Integer>)

我需要做什么来修复它?

编辑1:

abstract public class GraphMatrix<V,E> extends AbstractStructure<V> implements Graph<V,E>


编辑2:

public interface Graph<V,E> extends Structure<V>

public abstract class AbstractStructure<E> implements Structure<E>

public interface Structure<E> extends Iterable<E>
/* JDT added extension of Iterable for Java 5 */


编辑3:
注意:功能已从floyd更改为AllPairsShortestPath

public void AllPairsShortestPath(GraphMatrixDirected<V,E> g)
// post: g contains edge (a,b) if there is a path from a to b
{
    Iterator<V> witer = g.iterator();
    while (witer.hasNext())
    {
        Iterator<V> uiter = g.iterator();
        V w = witer.next();

        while (uiter.hasNext())
        {
            Iterator<V> viter = g.iterator();
            V u = uiter.next();

            while (viter.hasNext())
            {
                V v = viter.next();

                if (g.containsEdge(u,w) && g.containsEdge(w,v))
                {
                    Edge<V,E> leg1 = g.getEdge(u,w);
                    Edge<V,E> leg2 = g.getEdge(w,v);

                    Integer leg1Dist = (Integer)leg1.label();
                    Integer leg2Dist = (Integer)leg2.label();
                    Integer newDist = (Integer)leg1Dist+leg2Dist;

                    E newDistE = (E)newDist;

                    if (g.containsEdge(u,v))
                    {
                        Edge<V,E> across = g.getEdge(u,v);
                        Integer acrossDist = (Integer)across.label();

                        if (newDist < acrossDist)
                        {
                            across.setLabel(newDistE);
                        }
                    }
                    else
                    {
                        g.addEdge(u,v,newDistE);
                    }
                }
            }
        }
    }
}

最佳答案

也许您是说floyd是通用方法?

public <V,E> void floyd(GraphMatrixDirected<V,E> g)


否则,无论什么通用类型floyd是需要将<V,E>参数化为<String,Integer>的成员。

如果确实floyd属于一个泛型类型,但是floyd也需要是具有自己的类型参数的泛型方法,则可能要选择其他名称,以免彼此隐藏。

参考文献


Java Tutorials/Generics
Angelika Langer's Java Generic FAQs


Generic TypesGeneric Methods





关于泛型与泛型方法

在哪种解决方案路线之间进行选择取决于floyd的操作和其他事项。一个基本问题是:您是否认为floyd是专门属于通用类型GraphMatrixDirected<V,E>的方法(答案可能是否),或者它是适用于任何Graph<V,E>的通用实用程序方法? (答案可能是肯定的)。

作为示例和指南,我们还可以看一下Java Collections Framework的结构:


interface List<E>-通用类型,为该类型定义基本功能


指定boolean add(E e)E get(int index)

class Collections-提供static实用程序的通用方法


static void shuffle(List<?> list)
static <T extends Comparable<? super T>> void sort(List<T> list)
static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)



假设floyd确实是Floyd-Warshall all-pairs shortest path algorithm的实现,我认为说static类应该是Graphs实用程序方法,并且可以与任何Graph<V,E>一起使用。

另请参见有效Java 2nd Edition

泛型类型与方法:


第26项,有利的通用类型
项目27,偏爱的通用方法


接口:


第18项,更喜欢抽象类的接口
项目19,仅使用接口定义类型
项目52,通过其界面引用对象

07-24 18:30