我已经实例化了这样的对象:
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 Types和Generic 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,通过其界面引用对象