2010-04-02 7 views
17

बनाना मैं सहकर्मी नेटवर्क के लिए एक सहकर्मी में कुछ वितरित गणना करने के लिए एक आवेदन लिख रहा हूं। नेटवर्क को परिभाषित करने में मेरे पास दो वर्ग पी 2 पीनेटवर्क और पी 2 पी क्लाइंट है। P2PClient setNetwork (टी नेटवर्क) की एक विधि को परिभाषित करने के साथसर्कुलर जेनेरिक संदर्भ

P2PNetwork<T extends P2PClient<? extends P2PNetwork<T>>> 

P2PClient<T extends P2PNetwork<? extends T>> 

: मैं इन सामान्य हो सकता है और इसलिए की परिभाषा करना चाहते हैं। क्या मैं इस कोड के साथ वर्णन करने के लिए आशा करता हूं है:

  1. एक P2PNetwork एक खास प्रकार के ग्राहकों
  2. एक P2PClient केवल एक नेटवर्क जिसके ग्राहक इस रूप में एक ही प्रकार से मिलकर बनता है पास न हो की गठन किया गया है ग्राहक ( परिपत्र-संदर्भ)

यह मेरे लिए सही लगता है, लेकिन अगर मैं

MyP2PClient<MyP2PNetwork<? extends MyP2PClient>> myClient; 
0 के रूप में एक गैर जेनेरिक वर्जन इस तरह बनाने की कोशिश

और अन्य रूपों को मैं संकलक से कई त्रुटियां प्राप्त करता हूं। तो मेरे सवालों का इस प्रकार हैं:

  1. एक सामान्य वृत्तीय संदर्भ भी संभव (मैं स्पष्ट रूप से इसे मना कुछ भी कभी नहीं देखा है) है?
  2. क्या उपरोक्त सामान्य परिभाषा ऐसे परिपत्र संबंधों की सही परिभाषा है?
  3. अगर यह वैध है, यह "सही" तरह से ऐसे रिश्ते वर्णन करने के लिए नहीं है (यानी एक और वैध परिभाषा है, जो शैलीगत पसंदीदा है)?
  4. मैं क्लाइंट के गैर-जेनेरिक उदाहरण और सर्वर को उचित जेनेरिक परिभाषा को सही तरीके से परिभाषित कैसे करूं?
+0

मैं अभी भी एक निश्चित जवाब खोजने के लिए पर नहीं कर पाए हैं कि "यह संभव", फिर भी आगे पढ़ने और प्रयास मेरा मानना ​​है कि इसे बनाने के लिए संभव है से परिभाषा, लेकिन इसका उपयोग वस्तुओं को तुरंत चालू नहीं करने के लिए। –

उत्तर

24

परिपत्र सामान्य संदर्भ वास्तव में संभव हैं। Java Generics and Collections में कई उदाहरण शामिल हैं।आपके मामले के लिए, इस तरह के एक नमूना इस प्रकार दिखाई देगा:

public interface P2PNetwork<N extends P2PNetwork<N, C>, 
          C extends P2PClient<N, C>> { 
    void addClient(C client); 
} 

public interface P2PClient<N extends P2PNetwork<N, C>, 
          C extends P2PClient<N, C>> { 
    void setNetwork(N network); 
} 

class TorrentNetwork implements P2PNetwork<TorrentNetwork, TorrentClient> { 
    @Override 
    public void addClient(TorrentClient client) { 
    ... 
    } 
} 

class TorrentClient implements P2PClient<TorrentNetwork, TorrentClient> { 
    @Override 
    public void setNetwork(TorrentNetwork network) { 
    ... 
    } 
} 

... 

TorrentNetwork network = new TorrentNetwork(); 
TorrentClient client = new TorrentClient(); 

network.addClient(client); 
+2

ठीक है, तो आपका जवाब 6 साल पहले था, लेकिन यह अभी भी मुझे काम करने के लिए गेम <...> और गेमप्लेयर <...> प्राप्त करने का प्रयास कर रहे एक बड़े सिरदर्द को हल करने में मेरी मदद करता है! निश्चित रूप से स्टैक एक्सचेंज के बारे में मेरी पसंदीदा चीज। – corsiKa

3

यदि आप आगे बताते हैं कि "एक निश्चित प्रकार" का अर्थ क्या है, यानी पी 2 पीनेटवर्क के विभिन्न "प्रकारों" के बीच मतभेद क्या हैं, तो यह आपको जवाब देने में हमारी सहायता कर सकता है।

लेकिन बजाय एक दूसरे को करने के मामले में निर्भरता/परिपत्र संबंध को व्यक्त करने का है, यह एक तृतीय श्रेणी के शुरू करने से व्यक्त करने के लिए आसान हो सकता है, P2PType:

public class P2PNetwork<T extends P2PType> { 
    ... 
} 
public class P2PClient<T extends P2PType> { 
    ... 
    public void setNetwork(P2PNetwork<T> network) { ... } 
} 

मैं कुछ अनदेखी हो सकता है, लेकिन मैं इस बारे में सोच संकलक को यह लागू करने की अनुमति होगी कि P2PClients एक ही सामान्य प्रकार के P2PNetworks का हिस्सा हैं।

यह दृष्टिकोण अलग हो सकता है, हालांकि "प्रकार" ऐसा कुछ नहीं है जो ऑब्जेक्ट उन्मुख के रूप में व्यक्त करने के लिए उपयुक्त है, यानी P2PType ऐसा कुछ नहीं है जिसमें विधियां, बहुरूप व्यवहार, आदि

+0

विचार प्रकार नेटवर्क का उद्देश्य है। एक समेकित उदाहरण: जीवन के अर्थ का निर्धारण करने वाले बनाम प्राइम संख्या बनाम फाइब्रोनैची संख्याओं की गणना के लिए एक नेटवर्क। आधार आधार नेटवर्क वर्ग नेटवर्क के बारे में जानकारी प्रसारित करने और नेटवर्क के वास्तविक कार्य को संभालने के लिए नेटवर्क के राज्य और कनेक्टिविटी को बनाए रखने के लिए ज़िम्मेदार है। उन्होंने कहा कि यह एक अकादमिक हित भी बन गया है कि यदि सर्कुलर जेनेरिक परिभाषाएं संभव हैं, और यदि ऐसा है तो वे कैसे हासिल करेंगे। –

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