java - जेनेरिक पैरामीटर के साथ मुख्य विधि; यह काम क्यों करता है



generics main (1)

public static <T extends String> void main(T[] args) {
    System.out.println("Hello World!");
}

मैं यह देखने के लिए उत्सुक था कि क्या उपरोक्त स्निपेट कोड को संकलित और सफलतापूर्वक चलाएगा, और यह करता है! हालाँकि, मैंने यह भी सोचा कि यदि T extends String होता है तो T extends String को T extends String & AutoClosable साथ बदल दिया गया था T extends String & AutoClosable साथ क्या होगा; String AutoClosable लागू नहीं करता है, इसलिए मुझे उम्मीद नहीं थी कि यह सफलतापूर्वक चलेगा, लेकिन यह अभी भी करता है!

public static <T extends String & AutoCloseable> void main(T[] args) {
    System.out.println("This still works!");
}

तो मेरा सवाल है, यह अभी भी सफलतापूर्वक क्यों चलता है?

नोट :

  • मैं जावा 10.0.1 के साथ इसका परीक्षण कर रहा हूं
  • इंटेलीज इस पद्धति के साथ अच्छा नहीं खेलता क्योंकि यह इसे कार्यक्रम के प्रवेश बिंदु के रूप में नहीं देखता है; मैंने अन्य आईडीई के साथ इसका परीक्षण नहीं किया है।
  • आप कमांड-लाइन का उपयोग करके भी तर्क पारित करने में सक्षम हैं जैसे आप किसी अन्य कार्यक्रम के साथ करेंगे।

ऐसा इसलिए है क्योंकि एक प्रकार के पैरामीटर में एक सीमा होती है:

<T extends String>                  =>  String

<T extends String & AutoCloseable>  =>  String & AutoCloseable

और मिटा देने के बाद का बायोटेक दोनों मामलों में नियमित रूप से main घोषणा के लिए समान है:

public static main([Ljava/lang/String;)V

JLS §4.4। चर प्रकार:

किसी बाउंड में प्रकारों का क्रम केवल इतना ही महत्वपूर्ण होता है कि एक प्रकार के वैरिएबल का विलोपन उसके बाउंड में पहले प्रकार से निर्धारित होता है , और यह कि क्लास टाइप या टाइप वैरिएबल केवल पहली स्थिति में दिखाई दे सकता है।





type-inference