मेरे समस्या किया जा सकता अभिव्यक्त-अप इस स्निपेट द्वारा:जेनेरिक्स और सही प्रकार के लिए कास्टिंग
public interface TheClass<T> {
public void theMethod(T obj);
}
public class A {
private TheClass<?> instance;
public A(TheClass<?> instance) {
this.instance = instance;
}
public void doWork(Object target) {
instance.theMethod(target); // Won't compile!
// However, I know that the target can be passed to the
// method safely because its type matches.
}
}
मेरी कक्षा A
अपनी जेनरिक प्रकार अज्ञात साथ TheClass
का एक उदाहरण का उपयोग करता है। इसमें Object
के रूप में पारित लक्ष्य के साथ एक विधि है जिसमें TheClass
इंस्टेंस को किसी भी वर्ग के साथ पैरामीटर किया जा सकता है। हालांकि, संकलक मुझे इस तरह के लक्ष्य को पारित करने की अनुमति नहीं देगा, जो सामान्य है।
इस मुद्दे को रोकने के लिए मुझे क्या करना चाहिए?
एक गंदा समाधान TheClass<? super Object>
है, जो ठीक काम करता है लेकिन शब्दार्थ गलत है के रूप में उदाहरण घोषित करने के लिए ...
एक अन्य समाधान मैं पहले इस्तेमाल किया, कच्चे प्रकार के रूप में घोषित करने के लिए उदाहरण सिर्फ TheClass
था है, लेकिन यह बुरा है अभ्यास, इसलिए मैं अपनी गलती को सही करना चाहता हूं।
समाधान
public class A {
private TheClass<Object> instance; // type enforced here
public A(TheClass<?> instance) {
this.instance = (TheClass<Object>) instance; // cast works fine
}
public void doWork(Object target) {
instance.theMethod(target);
}
}
क्यों तुम भी टाइप न करें 'A'? –
+1, एक अच्छे प्रश्न के लिए !! उत्तर के लिए प्रतीक्षारत ... – aProgrammer
ए एक ओपन-सोर्स लाइब्रेरी का हिस्सा है जिसे मैंने बनाया है जिसका उपयोग बहुत से लोगों द्वारा किया जाता है, और टाइपिंग ए का मतलब एक मजबूत एपीआई ब्रेक होगा। मैंने हाल ही में इस मुद्दे की खोज की क्योंकि मैंने "TheClass" उदाहरण के लिए कच्चे प्रकार का उपयोग किया था, क्योंकि मुझे पता नहीं था कि यह बुरी अवधारणा थी। यह ठीक काम करता है, लेकिन बुरा अभ्यास माना जाता है इसलिए मैं इस दुरुपयोग को सही करना चाहता हूं। –