2011-05-23 17 views
12

इस उदाहरण पर विचार करें:एक ही स्थान पर कच्चे प्रकार कच्चे के रूप में इलाज के लिए कहीं और जेनेरिक कॉलसाइट क्यों करते हैं?

import java.util.*; 

class Foo<T> { 
    public int baz(List<String> stringlist) { return 1; } 
    public int baz(ArrayList<Object> objectlist) { return 2; } 

    public static void main(String[] args) { 
    Foo<String> foo = new Foo<String>(); // (A) 
    //Foo foo = new Foo();    // (B) 

    System.out.println(foo.baz(new ArrayList<String>())); 
    } 
} 

(A) में 1 क्यों प्रिंट करता है, लेकिन 2(B) के साथ?

मुझे पता है कि विधि समाधान कैसे काम करता है, इसलिए मुझे यह समझाने की कोई आवश्यकता नहीं है।

मैं इस "फीचर" के पीछे गहरी प्रेरणा जानना चाहता हूं। इसके बारे में कोई चेतावनी चेतावनी क्यों नहीं है? (Xzx31 के बारे में केवल एक है।) Xzx39

विधि संकल्प मिटाने वाले अर्थशास्त्र का उपयोग क्यों करता है हालांकि सामान्य प्रकार दिया जाता है?

उत्तर

5

यह क्योंकि जब संकलक resolving overloads है, यह या तो सामान्य या गैर सामान्य, कभी नहीं एक दो के मिश्रण के रूप में प्रत्येक विधि पर विचार करता है, तो उम्मीदवार हैं:

  1. Foo<T>.baz(List<String>)
  2. Foo<T>.baz(ArrayList<Object>)

अगर foo एक Foo<String>, या

    है
  1. Foo.baz(List)
  2. Foo.baz(ArrayList)

अगर foo एक Foo है।

Foo.baz(List<String>) जैसी कोई चीज नहीं है। या तो सभी प्रकार के पैरामीटर माना जाता है या कोई भी नहीं है। (मुझे इस बात से अवगत नहीं है कि जेएलएस में स्पष्ट रूप से कहा गया है, लेकिन यह एक सामान्य विधि के इलाज के बाद समझ में आता है जैसे कि यह कच्चे समतुल्य पीछे की संगतता सुविधा है।)

पहले मामले में, Foo<T>.baz(List<String>) मैचों लेकिन Foo<T>.baz(ArrayList<Object>) नहीं करता है।

दूसरे मामले में दोनों कार्य मिलते हैं, और Foo.baz(ArrayList)more specific है, इसलिए इसे चुना जाता है।

0

यह केस (ए) को संकलित भी नहीं करेगा यदि आप केवल एक विधि (त्रुटि: विधि को दिए गए प्रकार पर लागू नहीं किया जा सकता है) को संकलित नहीं करेंगे। मुझे लगता है कि ArrayList<String>ArrayList<Object> का उप-वर्ग नहीं है।

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

+4

निश्चित रूप से यह नहीं है। 'ArrayList के तत्व प्रकार को covariant के रूप में परिभाषित नहीं किया गया है। – soc