2010-09-16 3 views
11

implementiert Ich bin versucht, eine solche Art von Code zu tun, mit JGraphTIn Java gibt es eine Möglichkeit zu geben, dass ein Argument zwei Schnittstellen

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

public class SteinerTreeCalc { 

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


} 

Ich möchte einen Konstruktor erstellen, die für ein Objekt stellen zwei Durchführungs Schnittstellen.

Update:

In meinem Ziel ist es bereits ausgewählte Schulklassen für Vertex und Kanten (V und E), aber dank Menschen viel zu, die kommen mit:

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

Ich nehme an, Sie haben einen guten Grund, die Schnittstelle, die sowohl 'DirectedGraph' als auch' WeightedGraph' ist, nicht zu benennen, so dass Sie alle Teile des Vertrags erhalten können, die der Benutzer von 'SteinerTreeCalc' benötigt Unterstützung an einem Ort? –

+0

Ein guter! JgraphT bietet keine solche Schnittstelle, die sowohl ein DirectedGraph als auch ein WeightedGraph ist, und der Benutzer möchte möglicherweise nicht meine benutzerdefinierte Schnittstelle/Klassen verwenden. Ich verstehe nicht wirklich, warum sie diese Schnittstelle nicht zur Verfügung gestellt haben. – jwinandy

Antwort

21

Ja, es ist möglich:

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

Was ist V und E? Sollte es nicht SteinerTreeCalc sein & WeightedGraph > –

+2

Ich nehme an es ist eine innere Klasse, wo 'V' und' E' bekannt sind. Es ist auch in der ursprünglichen Frage abwesend. – amorfis

+0

Dies macht die Klasse jedoch generisch. – aioobe

2

Sie erstreckt statt implementiert in obigen Code verwenden können

6

Dies könnte das sein, was Sie wollen:
Hidden Features of Java

+0

Ja ist es. Ich werde einen tieferen Blick auf versteckte Funktionen werfen;) – jwinandy

9

Sollte wie dies funktionieren, aber dies ist Komplexierungsmittel Generika Logik, hoffen, dass Sie anpassen können:

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 
} 

Dies sind die Schnittstellen und der Konstruktor wie in deiner Frage gefragt.

+0

+1: Sehr ähnlich zu dem, was ich codiert habe. Würden "V" und "E" nicht auf der Klasse selbst und nicht auf dem Konstruktor liegen? Ich nehme an, es hängt von den Zielen des Autors ab. –

0

Wenn V und E sind konkrete Klassen statt Typparametern, dann könnten Sie eine neue Schnittstelle erstellen wie folgt:

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

dann

public class SteinerTreeCalc { 

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

Das Problem ist, dass die eigentliche Argument Muss implementieren Sie die DirectedWeightedGraph Schnittstelle. Ein Typ, der nur DirectedGraph<V,E> und WeightedGraph<V,E> implementiert, ist nicht ausreichend.

Verwandte Themen