2011-06-01 4 views
7

मैंने एक अधिसूचना प्रबंधक वर्ग बनाया, जो कि आप कुछ सामान्य अधिसूचना सेवा में एक सामान्य श्रोता पंजीकृत करते हैं।जावा: आप एक सामान्य प्रकार में निर्दिष्ट जेनेरिक प्रकार के समान होने के लिए कक्षा प्रकार पैरामीटर को कैसे लागू करते हैं?

public static <E> void registerNotify(Class<E> type, INotificationListener<E> listener) { 
    @SuppressWarnings("unchecked") 
    INotificationService<E> service = (INotificationService<E>) NotificationServiceFactory.get(type); 
    service.registerNotificationListener(listener); 
} 

तो, एक विशेष प्रकार के कुछ INotificationListener के लिए मैं उपयोगकर्ता के लिए मजबूर करना चाहते हैं, जब इस विधि बुला, निर्दिष्ट करने के लिए: NotificationManager वर्ग में मैं एक सेवा के साथ एक श्रोता के पंजीकरण के लिए एक सामान्य विधि है श्रोता के समान प्रकार। एक ही प्रकार के सभी इनोटिफिकेशन लिस्टेनर्स के लिए टाइप मैप्स, हालांकि यह विधि लागू नहीं करने के लिए जो मैं लागू करने की कोशिश कर रहा हूं उसे लागू नहीं करती है। उदाहरण के लिए, मैं कॉल कर सकता हूं:

INotificationListener<Location> locationListener = this; 
NotificationManager.registerNotify(String.class, locationListener); 

और कोड ठीक संकलित करता है। मैंने सोचा कि यह लागू होगा निम्नलिखित है:

INotificationListener<Location> locationListener = this; 
NotificationManager.registerNotify(Location.class, locationListener); 

इसे पूरा करने के तरीके पर कोई विचार?


अद्यतन:

mixup के लिए क्षमा करें, इसके बाद के संस्करण तथ्य काम में करता है।

public static <E> void broadcastNotify(Class<E> type, E data) 
    { 
     @SuppressWarnings("unchecked") 
     INotificationService<E> service = (INotificationService<E>) NotificationServiceFactory.get(type); 
     service.notifyListeners(data); 
    } 

और बुला: एक ही कक्षा जो काम नहीं करता है में विधि वास्तव में निम्नलिखित है

Location location = new Location(); 
NotificationManager.broadcastNotify(Object.class, location); 

एक संकलन त्रुटि है, जो है मैं यह करने के लिए करना चाहते हैं क्या कारण नहीं है।

+0

'अधिसूचना सेवा कारखाना # प्राप्त() 'के घोषित रिटर्न प्रकार क्या है? –

+0

यह INOTificationService है। फैक्ट्री में एक नक्शा होता है, जो क्लास टाइप नामों को इनोटिफिकेशन सर्विसेज में मैप करता है। मुझे लगता है कि यह शायद INOTificationService होना चाहिए, लेकिन मैं यह सुनिश्चित कैसे कर सकता हूं कि जब उपयोगकर्ता रजिस्टर में गलत वर्ग पास करता है तो उपयोगकर्ता को संकलन त्रुटि मिलती है? –

+1

मुझे यकीन नहीं है, लेकिन जब मैं 'String.class' (ग्रहण हेलीओस SR2) पास करने का प्रयास करता हूं तो मुझे वांछित संकलन त्रुटि मिलती है। क्या आप वाकई कोड चला रहे हैं जो आपको लगता है कि आप चल रहे हैं? या आप जावैक या एक अलग आईडीई का उपयोग कर रहे हैं? – BalusC

उत्तर

1

मैंने इसे समझ लिया।

public static <E> void broadcastNotify(Class<E> type, E data) 

करने के लिए:: मैं के हस्ताक्षर बदल

public static <E> void broadcastNotify(Class<E> type, INotification<E> data) 

जहां INotification कुछ इंटरफेस है कि डेटा मैं अधिसूचना में वापस जाने के लिए कोशिश कर रहा हूँ लपेटता है। यह लागू करता है कि वर्ग प्रकार को अधिसूचना प्रकार से बिल्कुल मेल खाना चाहिए ताकि अधिसूचनाओं को मानचित्रित करने वाले अंतर्निहित मानचित्र प्रोग्रामर त्रुटि की चिंता किए बिना संदेशों को पंजीकृत श्रोताओं को सही तरीके से भेज दें।

0

समस्या से बचने का एक तरीका प्रतिबिंब का उपयोग करना और कक्षा से ही प्रकार प्राप्त करना है। यह एक ही प्रकार को दो बार प्रदान करने की आवश्यकता से बचा जाएगा। यह केवल एक चेतावनी प्रदान करेगा एक गैर-सामान्य प्रकार का उपयोग किया जाता है।

आप कार्यान्वयन वर्ग के लिए इंटरफ़ेस से सामान्य प्रकार प्राप्त कर सकते हैं।

+0

मैंने पठनीयता की वजह से इस मार्ग पर जाने का फैसला नहीं किया। यदि कोई वर्ग श्रोताओं के पैरामीटर के रूप में 'इस' का उपयोग करके विभिन्न प्रकार के श्रोताओं का एक समूह पंजीकृत करता है और अनियंत्रित करता है, तो यह बताना मुश्किल है कि यह सूचनाओं के लिए पंजीकरण/पंजीकरण नहीं कर रहा है। –

+0

यह इसे स्वीकार करने वाले अधिसूचना प्रकारों को पंजीकृत/अनियंत्रित करता है। आपको केवल कार्यान्वयन को देखना होगा। लेकिन मैं मानता हूं कि जो कुछ आपको लगता है वह करने के लिए सबसे अच्छा है, और कम से कम एक त्रुटि का परिणाम होने की संभावना है। –

0

स्थान एक वस्तु है - मेरा मानना ​​है कि यह हो जाता है:

public static <Object> void broadcastNotify(Class<Object> type, Object data) 

जावा में याद रखें सभी वस्तुओं वस्तु से विरासत।

+0

मुझे पता है, लेकिन मैं इसे एक ही कक्षा के रूप में लागू करना चाहता हूं क्योंकि मेरे पास एक नक्शा है, जो क्लास को उस वर्ग के श्रोताओं को मानचित्र करता है, इसलिए यदि कोई रजिस्टर रजिस्टर के साथ पंजीकृत है (स्थान। क्लास, यह), लेकिन एक प्रसारण को प्रसारित नहीं किया गया है नोटिफ़ाई (ऑब्जेक्ट.क्लास, स्थान) श्रोताओं को संदेश नहीं मिलेगा। –

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