अपडेट: उन सभी के लिए धन्यवाद जिन्होंने मदद की - इसका उत्तर उस में पड़ा जो मैं अपने जटिल कोड में नहीं देख रहा था और जिसे मुझे जावा 5 कॉन्वेंट रिटर्न प्रकारों के बारे में नहीं पता था ।एनमम्स के साथ जावा जेनरिक का उपयोग
मूल पोस्ट:
मैं आज सुबह कुछ के साथ प्रयोग करना रहा है। जबकि मुझे पता है कि इस पूरी समस्या से अलग तरीके से निपट सकता है, मैं खुद को यह समझने के साथ भ्रमित कर रहा हूं कि यह जिस तरह से काम कर रहा था, वह क्यों काम नहीं कर रहा है। इस पर चारों ओर पढ़ने के कुछ समय बाद, मुझे लगता है कि मैं समझने के करीब नहीं हूं, इसलिए मैं इसे एक प्रश्न के रूप में पेश करता हूं यह देखने के लिए कि क्या मैं सिर्फ बेवकूफ हूं या अगर वास्तव में कुछ है तो मुझे समझ में नहीं आता ।
मैं बहुत की तरह एक कस्टम घटना पदानुक्रम बनाया है: तो की तरह एक ठोस कार्यान्वयन के साथ
public abstract class AbstractEvent<S, T extends Enum<T>>
{
private S src;
private T id;
public AbstractEvent(S src, T id)
{
this.src = src;
this.id = id;
}
public S getSource()
{
return src;
}
public T getId()
{
return id;
}
}
:
public class MyEvent
extends AbstractEvent<String, MyEvent.Type>
{
public enum Type { SELECTED, SELECTION_CLEARED };
public MyEvent(String src, Type t)
{
super(src, t);
}
}
और फिर मैं की तरह तो एक ईवेंट बनाते हैं:
fireEvent(new MyEvent("MyClass.myMethod", MyEvent.Type.SELECTED));
जहां मेरे फायरएवेंट को परिभाषित किया गया है:
protected void fireEvent(MyEvent event)
{
for(EventListener l : getListeners())
{
switch(event.getId())
{
case SELECTED:
l.selected(event);
break;
case SELECTION_CLEARED:
l.unselect(event);
break;
}
}
}
तो मैंने सोचा कि यह बहुत सरल होगा लेकिन यह पता चला है कि घटना.getId() के लिए कॉल करने वाले संकलक में मुझे यह बताते हुए कि मैं Enums, केवल परिवर्तनीय int मान या enum स्थिरांक पर स्विच नहीं कर सकता।
यह MyEvent के लिए निम्न विधि जोड़ना संभव है:
public Type getId()
{
return super.getId();
}
एक बार मैं ऐसा करते हैं, सब कुछ बिल्कुल काम करता है के रूप में मैं इसे करने की उम्मीद। मुझे इस के लिए एक कामकाज खोजने में दिलचस्पी नहीं है (क्योंकि मेरे पास स्पष्ट रूप से एक है), मुझे किसी भी अंतर्दृष्टि में दिलचस्पी है कि लोगों के पास ऐसा क्यों नहीं हो सकता है क्योंकि यह काम नहीं करता है क्योंकि मुझे बल्ले से बाहर निकलने की उम्मीद है।
क्रिस, क्या आप 'फायरवेन्ट' युक्त कक्षा की कक्षा घोषणा दिखा सकते हैं? – notnoop
समस्या वास्तव में थी कि मेरे सार तत्व जो मैंने यहां पोस्ट किया उससे कहीं अधिक जटिल है। मुझे * खिलौना कार्यान्वयन बनाया जाना चाहिए और इसे ** पोस्ट करने से पहले ** परीक्षण किया जाना चाहिए! मदद करने वाले हर किसी के लिए धन्यवाद! जवाब से यह था कि मेरी getId() विधि 'कोविरिएंट रिटर्न टाइप' थी - मेरे पास कक्षा में दफन किया गया एक और कार्यान्वयन था जिसे एनम रिटर्न प्रकार के रूप में परिभाषित किया गया था। जब मैंने इसे हटा दिया, स्विच स्टेटमेंट संकलन शुरू कर दिया। कम से कम आने के लिए –
-0 ... –