2016-05-25 4 views
6

शायद मुझे कुछ याद आ रही है और शायद मेरी धारणाएं गलत थीं, लेकिन मैंने सोचा कि जब मैं T टाइप के साथ पैरामीट्रिज्ड विधि घोषित करता हूं तो इससे कोई फर्क नहीं पड़ता कि उस प्रकार के साथ कितने चर हैं इसी प्रकार का। लेकिन मुझे लगता है कि यह संकलित करता है और यह मेरे विचार का खुलासा करता है।विधि एक प्रकार के साथ पैरामीट्रिज्ड दो प्रकारों को स्वीकार करता है

static <T> void f(T a, T b) { } 

public static void main(String[] args) { 
    f(Integer.MIN_VALUE, "..."); 
} 

तो अगर मेरे विधि एक प्रकार से parametrized है और मैं उपयोग कर रहा हूँ कि दो paramteres में एक प्रकार क्यों यह मुझे दो पूरी तरह से अलग अलग प्रकार के साथ दो वस्तुओं को भेजने के लिए अनुमति देता है? मुझे लगता है कि यह TObject के रूप में इलाज करने के लिए नीचे आता है?

+5

"मुझे लगता है कि यह ऑब्जेक्ट के रूप में टी का इलाज करने के लिए नीचे आता है?" हाँ। आप बस 'स्थिर शून्य एफ (ऑब्जेक्ट ए, ऑब्जेक्ट बी) {} 'घोषित कर सकते हैं। –

+0

और भी मजाकिया, टाइप मिरर 'स्थिर <टी, एस विस्तारित टी> शून्य एफ (टी ए, एस बी) {...} ' – hoefling

उत्तर

4

हालांकि इंटीजर और स्ट्रिंग दो अलग-अलग प्रकार हैं, फिर भी वे एक सामान्य सुपर-प्रकार साझा करते हैं। Serializable

इसे प्रमाणित करने के, लौट T की सुविधा देता है,

static <T> T f(T a, T b) { 
    return null; 
} 
Serializable s = f(Integer.MIN_VALUE, "..."); // compiles 

संकलक का समाधान हो जाएगा (या अनुमान लगाते हैं, तकनीकी शब्द बारे में निश्चित नहीं) सबसे विशिष्ट प्रकार के। उदाहरण के लिए,

Number number = f(Integer.MAX_VALUE, BigDecimal.ONE); 

अब, प्रकार का समाधान है Number क्योंकि दोनों प्रकार Number के उपप्रकार है, साथ ही Serializable, साथ ही निश्चित रूप से Object हैं।

+3

का निर्माण करता है, मुझे लगता है कि आम सुपर प्रकार वास्तव में' ऑब्जेक्ट 'है। यह कक्षाओं के दो उदाहरणों पर ठीक से संकलित करता है जिनके पास 'ऑब्जेक्ट' के अलावा एक सामान्य सुपर प्रकार नहीं है। – Casey

+0

@Casey कृपया मेरे संपादन की जांच करें। बेशक वस्तु सामान्य है, लेकिन Serializable अधिक विशिष्ट है –

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

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