निम्नलिखित विधि है जो उपयोग करें? (वाइल्डकार्ड)
public static void doSomething(Set<?> set)
{
Set<?> copy = new HashSet<Object>(set);
for (Object o : copy)
{
System.out.println(o);
}
}
जेनरिक के साथ विधि का पालन
public static <T> void doSomething(Set<T> set)
{
Set<T> copy = (Set<T>) new HashSet<Object>(set); //Type safety: Unchecked cast from HashSet<Object> to Set<T>
for (T t : copy)
{
System.out.println(t);
}
}
दोनों ठीक काम करते हैं लेकिन दूसरे उदाहरण के लिए चेतावनी दिखाते हैं जैसा कि टिप्पणी में दिखाया गया है।
जेनेरिक के साथ टाइपकास्ट की आवश्यकता क्यों है और वाइल्डकार्ड के साथ नहीं?
कृपया मुझे अवधारणा को समझने में मदद करें! धन्यवाद ;)
2 जवाब
Set<?> copy = new HashSet<Object>(set);
उपरोक्त कथन के लिए, आप वाइल्डकार्ड ?
का उपयोग कर रहे हैं और इसका मतलब है कि Any Type
का सेट स्पष्ट रूप से टाइपकास्ट करने की आवश्यकता नहीं है। अब यहाँ यदि हैशसेट बनाते समय इसके अलावा अन्य वस्तु है तो यह संकलन समय त्रुटि दिखाएगा। आप बेहतर समझ के लिए खुद के आसपास प्रयास कर सकते हैं :)
Set<T> copy = (Set<T>) new HashSet<Object>(set);
उपरोक्त कथन का अर्थ है सेट का प्रकार T
। इसलिए, स्पष्ट रूप से टाइपकास्ट करने की आवश्यकता है। हमेशा Object
प्रकार बताने का कोई तरीका नहीं है। इसलिए यह प्रकार की सुरक्षा के लिए चेतावनी दिखाता है।
OracleJavaDocs देखें
ऑब्जेक्ट के बजाय, सीधे हैशसेट के लिए सामान्य प्रकार का उपयोग करें। इसके अलावा आपको हैशसेट लागू होने के बाद से सेट पर वापस जाने की जरूरत नहीं है। तो यह काम करना चाहिए:
public static <T> void doSomething(Set<T> set)
{
Set<T> copy = new HashSet<T>(set);
for (T t : copy)
{
System.out.println(t);
}
}
संबंधित सवाल
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।