2010-09-16 11 views
11

estoy tentado de hacer este tipo de código, usando JGraphTEn Java, ¿hay una forma de especificar que un argumento implementa dos interfaces

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

public class SteinerTreeCalc { 

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


} 

Quiero crear un constructor que pida un objeto que implementa dos interfaces.

Actualización: clases

En mi objetivo, que ya son elegidos por vértices y aristas (V y E), pero muchas gracias a las personas que vienen con:

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

Supongo que tiene una buena razón para no nombrar la interfaz que es tanto un 'DirectedGraph' como un' WeightedGraph', de modo que puede obtener todos los bits del contrato que el usuario del 'SteinerTreeCalc' necesita soporte en un solo lugar? –

+0

¡Una buena! JgraphT no proporciona dicha interfaz que sea tanto DirectedGraph como WeightedGraph, y el usuario puede no querer utilizar mi interfaz/clases personalizadas. Realmente no entiendo por qué no proporcionaron esta interfaz. – jwinandy

Respuesta

21

Sí, es posible:

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

¿Qué es V y E? ¿No debería ser SteinerTreeCalc & WeightedGraph > –

+2

Supongo que es una clase interna, donde se conocen 'V' y' E'. Está ausente también en la pregunta original. – amorfis

+0

Esto hace que la clase sea genérica. – aioobe

2

se puede utilizar extiende en lugar de implementos en el código de

6

Esto podría ser lo que quiere: 012 Hidden Features of Java

+0

Sí lo es. Voy a echar un vistazo más profundo a las características ocultas;) – jwinandy

9

deben trabajar de esta manera, pero esto es genéricos complexer lógica, esperamos que usted puede adaptar:

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 
} 

Estas son las interfaces y el constructor como preguntado en tu pregunta.

+0

+1: Muy similar a lo que estaba codificando. Sin embargo, ¿no residirían 'V' y' E' en la clase en sí y no en el constructor? Supongo que depende de los objetivos del autor. –

0

Si V y E son clases concretas en lugar de los parámetros de tipo, entonces se podría crear una nueva interfaz de la siguiente manera:

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

continuación

public class SteinerTreeCalc { 

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

El problema es que el actual argumento obligada implementar la interfaz DirectedWeightedGraph. Un tipo que simplemente implementa DirectedGraph<V,E> y WeightedGraph<V,E> no es suficiente.

Cuestiones relacionadas