2016-03-25 16 views
10
public class Main { 

    public static <T> void foo(T[] bar) { 
     double d = (double) bar[0]; // Error : incompatible types 
    } 

    public static void main(String[] args) { 
     int[] int_buf = new int[8]; 
     foo(int_buf); 
    } 
} 

समस्या कोड में इंगित किया गया है।जावा जेनेरिक सामान्य प्रकारों पर प्रकार रूपांतरण की अनुमति क्यों नहीं देता है?

जावा जेनेरिक सामान्य प्रकारों पर प्रकार रूपांतरण की अनुमति क्यों नहीं देता है?

उत्तर

13

ऐसा इसलिए है क्योंकि आप निर्दिष्ट नहीं कर रहे हैं कि सामान्य प्रकार T क्या है। तो डिफ़ॉल्ट रूप से ऐसा लगता है कि टी एक ऑब्जेक्ट प्रकार है, संख्या नहीं। ऑब्जेक्ट को डबल पर डालना संभव नहीं है, इससे कोई मतलब नहीं है।

यदि आप <T extends Number> में बदलते हैं तो यह ठीक काम करना चाहिए। हालांकि, आपको int array

+0

यदि दिया गया सरणी इंटीजर [] के बजाय पहले से ही int [] है, तो क्या यह काम करने का कोई तरीका है? – xmllmx

+0

उल्लेखनीय है कि '<टी संख्या बढ़ाता है> 'काम करेगा; मेरे द्वारा +1 –

+8

@xmllmx यह काम नहीं करेगा क्योंकि 'int' एक आदिम प्रकार है जो ऑब्जेक्ट प्रकार नहीं है। – Satya

-2

के बजाय एक इंटीजर सरणी की आवश्यकता हो सकती है, जावा कंपाइलर जेनेरिक कोड में सभी प्रकार के पैरामीटर मिटा देता है। इसका प्रत्यक्ष परिणाम यह है कि आप यह सत्यापित नहीं कर सकते कि वर्तमान में जेनेरिक के लिए कौन सा पैरामीटरयुक्त प्रकार उपयोग किया जाता है। यदि आप परीक्षण करते हैं, instanceof या तो काम नहीं करेगा। चूंकि, रनटाइम जावा में किसी प्रकार के पैरामीटर का ट्रैक नहीं रखता है, और HashSet<Double> के बीच कोई अंतर नहीं है। यह जांचने के लिए कि क्या यह हैशसेट का उदाहरण है, आप सबसे अधिक ..instanceof HashSet<?> कर सकते हैं।

यदि मैंने जो लिखा है उसमें कुछ स्पष्ट नहीं है, तो कृपया docs देखें।

+1

यह उत्तर सही है, लेकिन मुझे नहीं लगता कि यह प्रश्न का उत्तर देता है। –

15

समस्या इससे भी गहरी है। यहां तक ​​कि लाइन आप पर प्रकाश डाला बिना, इस कार्यक्रम से टूट गया है:

public class Main { 
    public static <T> void foo(T[] bar) { 
     // do nothing 
    } 

    public static void main(String[] args) { 
     int[] int_buf = new int[8]; 
     foo(int_buf); <-- problem is here 
    } 
} 

जावा जेनरिक केवल प्रकार पैरामीटर के रूप में संदर्भ प्रकारों का समर्थन;

<T extends Object> void foo(T[] bar) { ... } 

और यहाँ आपकी समस्या है: कोई T कि फैली Object ऐसी है कि एक int[] एक T[] है सामान्य विधि foo() के रूप में फिर से लिखा जा सकता है।

दूसरा, रूपांतरण भी विफल होने का कारण यह है कि हम T के बारे में कुछ भी नहीं जानते हैं, इसलिए हम नहीं जानते कि T से double पर कोई रूपांतरण मौजूद है।

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