2010-09-16 10 views
11

लागू करता है निर्दिष्ट करने के लिए एक तरीका है मुझे लगता है मैं एक निर्माता है कि एक वस्तु दो को लागू करने के लिए पूछ बनाना चाहते हैं, कोड इस तरह करने के लिए jGraphTजावा में, वहाँ है कि एक तर्क दो इंटरफेस

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

public class SteinerTreeCalc { 

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


} 

का उपयोग कर परीक्षा कर रहा हूँ इंटरफेस।

अद्यतन:

मेरा लक्ष्य में, वहाँ पहले से ही चुना जाता है लेकिन जो लोग साथ आने के लिए वर्टेक्स और किनारों (वी और ई) के लिए कक्षाएं, बहुत बहुत शुक्रिया:

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

मुझे लगता है आप इंटरफेस है कि दोनों एक 'DirectedGraph' और एक' WeightedGraph' नामकरण नहीं के लिए एक अच्छा कारण है, ताकि आप अनुबंध के सभी बिट्स कि 'SteinerTreeCalc' के उपयोगकर्ता के लिए आवश्यक है प्राप्त कर सकते हैं एक जगह में समर्थन? –

+0

एक अच्छा है! JgraphT ऐसा इंटरफ़ेस प्रदान नहीं करता है जो एक निर्देशित ग्राफ और एक भारित ग्राफ दोनों है, और उपयोगकर्ता मेरे कस्टम इंटरफ़ेस/कक्षाओं का उपयोग नहीं करना चाहता है। मैं वास्तव में समझ में नहीं आता कि उन्होंने यह इंटरफ़ेस क्यों प्रदान नहीं किया। – jwinandy

उत्तर

21

हाँ, यह संभव है:

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

वी और ई क्या है? यह SteinerTreeCalc नहीं होना चाहिए <वी, ई, टी निर्देशित ग्राफ और भारित ग्राफ > –

+2

मुझे लगता है कि यह कुछ आंतरिक वर्ग है, जहां 'वी' और' ई' ज्ञात हैं। मूल प्रश्न में यह अनुपस्थित है। – amorfis

+0

हालांकि कक्षा सामान्य है। – aioobe

2

आप उपयोग कर सकते हैं फैलीके बजाय औजार उपरोक्त कोड में

6

यह हो सकता है कि आप क्या चाहते:
Hidden Features of Java

+0

हां यह है। मैं छिपी हुई सुविधाओं को गहराई से देखूंगा;) – jwinandy

9

इस तरह काम करना चाहिए, लेकिन इस complexer जेनरिक तर्क है, आशा है कि आप अनुकूलित कर सकते हैं:

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 
} 

इन इंटरफेस और निर्माता की तरह हैं आपके प्रश्न में पूछा।

+0

+1: मैं कोडिंग के समान ही था। हालांकि, 'वी' और 'ई 'वर्ग पर ही नहीं रहेंगे, न कि कन्स्ट्रक्टर पर? मुझे लगता है कि यह लेखक के लक्ष्यों पर निर्भर करता है। –

0

तो 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> पर्याप्त नहीं है।

संबंधित मुद्दे