В Java есть способ указать, что аргумент реализует два интерфейса - PullRequest
11 голосов
/ 16 сентября 2010

Я испытываю желание сделать такой код, используя 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>>  
{ 
   ....
}

Ответы [ 5 ]

21 голосов
/ 16 сентября 2010

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

public class SteinerTreeCalc<T extends DirectedGraph<V,E> & WeightedGraph<V,E>> {
  public SteinerTreeCalc(T graph) {
    ......
  }
}
9 голосов
/ 16 сентября 2010

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

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
}

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

6 голосов
/ 16 сентября 2010

Это может быть то, что вы хотите:
Скрытые возможности Java

2 голосов
/ 16 сентября 2010

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

0 голосов
/ 16 сентября 2010

Если 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>, недостаточен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...