निम्नलिखित विधि है जो उपयोग करें? (वाइल्डकार्ड)

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);
    }
}

दोनों ठीक काम करते हैं लेकिन दूसरे उदाहरण के लिए चेतावनी दिखाते हैं जैसा कि टिप्पणी में दिखाया गया है।

जेनेरिक के साथ टाइपकास्ट की आवश्यकता क्यों है और वाइल्डकार्ड के साथ नहीं?

कृपया मुझे अवधारणा को समझने में मदद करें! धन्यवाद ;)

0
silly questions 1 पद 2015, 16:22

2 जवाब

सबसे बढ़िया उत्तर
Set<?> copy = new HashSet<Object>(set);

उपरोक्त कथन के लिए, आप वाइल्डकार्ड ? का उपयोग कर रहे हैं और इसका मतलब है कि Any Type का सेट स्पष्ट रूप से टाइपकास्ट करने की आवश्यकता नहीं है। अब यहाँ यदि हैशसेट बनाते समय इसके अलावा अन्य वस्तु है तो यह संकलन समय त्रुटि दिखाएगा। आप बेहतर समझ के लिए खुद के आसपास प्रयास कर सकते हैं :)

Set<T> copy = (Set<T>) new HashSet<Object>(set);

उपरोक्त कथन का अर्थ है सेट का प्रकार T। इसलिए, स्पष्ट रूप से टाइपकास्ट करने की आवश्यकता है। हमेशा Object प्रकार बताने का कोई तरीका नहीं है। इसलिए यह प्रकार की सुरक्षा के लिए चेतावनी दिखाता है।

OracleJavaDocs देखें

1
Prashant Shilimkar 2 पद 2015, 05:10

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

  public static <T> void doSomething(Set<T> set)
    {
        Set<T> copy = new HashSet<T>(set);
        for (T t : copy)
        {
            System.out.println(t);
        }
    }
1
eol 1 पद 2015, 13:41