在Java中,是否有一种方式可以指定一个参数实现两个接口?

12

我很想使用jGraphT来编写这种类型的代码。

/*
  interface DirectedGraph<V,E> { ...}
  interface WeightedGraph<V,E> { ...}
*/

public class SteinerTreeCalc  {

    public SteinerTreeCalc( < ??? implements DirectedGraph<V,E>, WeightedGraph<V,E> > graph )  {
     ......
    }


}

我想创建一个构造函数,要求传入实现两个接口的对象。
更新:
在我的目标中,已经选择了Vertex和Edges(V和E)的类,但非常感谢那些提出建议的人。
public class SteinerTreeCalc <V, E, T extends DirectedGraph<V, E> & WeightedGraph<V, E>>  
{ 
   ....
}

我假设你有充分的理由不给既是DirectedGraph又是WeightedGraph的接口命名,这样你就可以将SteinerTreeCalc的用户需要支持的所有合同条款放在一个地方吗? - Donal Fellows
一个好的例子!JgraphT没有提供既是DirectedGraph又是WeightedGraph的接口,而且用户可能不想使用我的自定义接口/类。我真的不明白为什么他们没有提供这个接口。 - jwinandy
5个回答

21

是的,这是可能的:

public class SteinerTreeCalc<T extends DirectedGraph<V,E> & WeightedGraph<V,E>> {
  public SteinerTreeCalc(T graph) {
    ......
  }
}

V和E是什么?不应该是SteinerTreeCalc<V,E,T extends DirectedGraph<V,E> & WeightedGraph<V,E>>吗? - bruno conde
2
我认为这是一些内部类,其中VE是已知的。它在原始问题中也不存在。 - amorfis
这使得该类变成了通用类。 - aioobe

9
应该像这样工作,但这是更复杂的泛型逻辑,希望您能适应。
public static interface DirectedGraph<V, E> {
}

public static interface WeightedGraph<V, E> {
}

public <V, E, T extends DirectedGraph<V, E> & WeightedGraph<V, E>> SteinerTreeCalc(T bothInterfaces) {
    // do it
}

这些是你问题中所要求的接口和构造函数。


+1:非常类似于我正在编写的内容。但是,VE不应该驻留在构造函数上,而应该驻留在类本身上。我想这取决于作者的目标。 - Adam Paynter

6

是的。我会更深入地研究隐藏功能 ;) - jwinandy

2

在上述代码中,您可以使用扩展而不是实现


0
如果VE是具体类而不是类型参数,则可以创建一个新接口,如下所示:
public interface DirectedWeightedGraph extends 
    DirectedGraph<V,E>, WeightedGraph<V,E> {
}

那么

public class SteinerTreeCalc  {

    public SteinerTreeCalc(DirectedWeightedGraph graph)  {
       ...
    }
}

问题在于实际参数必须实现DirectedWeightedGraph接口。仅实现DirectedGraph和WeightedGraph的类型是不够的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接