В 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>>  
{ 
   ....
}

Ответ 1

Да, возможно:

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

Ответ 2

Должно работать так, но это сложная логика генериков, надеюсь, что вы сможете адаптироваться:

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
}

Это интерфейсы и конструктор, которые заданы в вашем вопросе.

Ответ 4

вы можете использовать extends вместо реализует в приведенном выше коде

Ответ 5

Если V и E являются конкретными классами, а не типом параметров, то вы можете создать новый интерфейс следующим образом:

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

затем

public class SteinerTreeCalc  {

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

Проблема заключается в том, что фактический аргумент должен реализовывать интерфейс DirectedWeightedGraph. Тип, который просто реализует DirectedGraph<V,E> и WeightedGraph<V,E>, недостаточен.