Ответ 1
Да, возможно:
public class SteinerTreeCalc<T extends DirectedGraph<V,E> & WeightedGraph<V,E>> {
public SteinerTreeCalc(T graph) {
......
}
}
У меня возникает соблазн сделать такой код, используя 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>>
{
....
}
Да, возможно:
public class SteinerTreeCalc<T extends DirectedGraph<V,E> & WeightedGraph<V,E>> {
public SteinerTreeCalc(T graph) {
......
}
}
Должно работать так, но это сложная логика генериков, надеюсь, что вы сможете адаптироваться:
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
}
Это интерфейсы и конструктор, которые заданы в вашем вопросе.
Это может быть то, что вы хотите:
Скрытые особенности Java
вы можете использовать extends вместо реализует в приведенном выше коде
Если 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>
, недостаточен.