在Java中,有没有办法指定参数实现两个接口

时间:2010-09-16 08:52:11

标签: java

我很想使用jGraphT

来做这样的代码
/*
  interface DirectedGraph<V,E> { ...}
  interface WeightedGraph<V,E> { ...}
*/

public class SteinerTreeCalc  {

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


}

我想创建一个构造函数,要求实现两个接口的对象。

更新:

在我的目标中,已经选择了顶点和边缘(V和E)的类,但非常感谢那些想出来的人:

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

5 个答案:

答案 0 :(得分:21)

是的,有可能:

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

答案 1 :(得分: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
}

这些是你问题中提到的接口和构造函数。

答案 2 :(得分:6)

这可能是你想要的:
Hidden Features of Java

答案 3 :(得分:2)

您可以在上面的代码中使用 extends 代替 implements

答案 4 :(得分:0)

如果VE是具体类而不是类型参数,那么您可以创建一个新接口,如下所示:

public interface DirectedWeightedGraph extends 
    DirectedGraph<V,E>, WeightedGraph<V,E> {
}

然后

public class SteinerTreeCalc  {

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

问题是实际的参数必须实现DirectedWeightedGraph接口。仅实现DirectedGraph<V,E>WeightedGraph<V,E>的类型是不够的。