2012-06-01 7 views
15

मैं परिभाषित किया है:"विधि प्रकार के लिए अस्पष्ट है" लेकिन प्रकार के अस्पष्ट नहीं हैं (और त्रुटि 4.2 ग्रहण करने के लिए ग्रहण 3.7.2 से अपग्रेड से आता है)

public static int[] getArray(final int... params) { 
    return params; 
} 
public static <T> T[] getArray(final T... params) { 
    return params; 
} 

और मैं

में इस का उपयोग
getArray(1, 2) 

और अब मैं संकलन त्रुटि ग्रहण 4.2 में मिलता है:

method is ambiguous for the type

लेकिन जैसा कि आप देख सकते हैं कि यह अस्पष्ट नहीं है। मैं क्या कर सकता हूँ?

+0

संकलक ऑटोबॉक्सिंग लागू करने का प्रयास कर रहा है, इस स्थिति में यह आपकी किसी भी विधि को नहीं चुन सकता है। मुझे यकीन नहीं है, लेकिन आप अपने तर्कों को स्पष्ट रूप से कास्ट करने का प्रयास कर सकते हैं: 'getArray ((int) 1, (int) 2) ' –

+0

कृपया उचित भाषा (जावा? सी #?) के साथ टैग करें। –

+1

जिस तरह से जेडीके 1.7 से जावैक ग्रहण 4.2 –

उत्तर

9

वास्तव में इस अस्पष्ट है क्योंकि जावा में Autoboxing आप एक विधि है कि एक Integer और इसके विपरीत के साथ एक int उम्मीद कॉल करने के लिए अनुमति देता है, तो getArray(1, 2) वास्तव में अपने तरीकों में से किसी के लिए एक वैध कॉल हो सकता है।

जहां तक ​​मैं समझता हूं कि आप क्या कर रहे हैं, आप किसी भी चीज को बनाने के लिए उपयोगिता विधि चाहते हैं। शायद सबसे सरल चीज जो आप कर सकते हैं वह उस विधि का नाम बदलती है जो int से getIntArray() से संबंधित है। या बस new int[] {1, 2} का उपयोग करें जो बहुत ही पठनीय है यदि आप int सरणी चाहते हैं।

आप इस जानकारी को http://docs.oracle.com/javase/specs/jls/se5.0/jls3.pdf पर भाषा के विनिर्देशन में देख सकते हैं (आपके मामले में, आविष्कार विधि निर्धारित करना धारा 15.12.2 संकलित समय चरण 2 में वर्णित प्रक्रिया के चरण 3 पर जाएगा: विधि हस्ताक्षर निर्धारित करें, क्योंकि आप arity variable का उपयोग करते हैं, और चरण 3 पर, दोनों विधि कॉल मान्य हैं)

+0

मुझे नहीं लगता कि यह स्पष्ट है। हमारे पास एक ही प्रोजेक्ट-सेटिंग्स थी जो ग्रहण 4.2 (पूर्व ग्रहण 3.7.2) में अपग्रेड से पहले बनाने के लिए jdk6-compilance-level का उपयोग करती है और हमें इमारत पर कोई त्रुटि नहीं थी। ऑटो-मुक्केबाजी पहले से ही पूर्व विन्यास में उपयोग किया गया था। क्यों उन्नयन इस समस्या को लाता है? – elb

+0

@ user1430985 मैंने विनिर्देश के लिए एक संदर्भ जोड़ा, जो व्यवहार को समझाता है।अगर मैं विनिर्देश पर विश्वास करता हूं, तो आपकी परियोजना ग्रहण कंपाइलर के पिछले संस्करण में एक बग से निर्भर हो गई थी। –

23

यह ग्रहण bug 383780 में एक बग के रूप में रिपोर्ट किया गया था।
यहाँ ठीक की प्रलेखन है: https://bugs.eclipse.org/bugs/attachment.cgi?id=218320

मूल रूप से, संकलक त्रुटि को ठीक करने, नवीनतम ग्रहण रिलीज (4.2.1 अब के रूप में), -vmargs के बाद निम्नलिखित पंक्ति जोड़ eclipse.ini में मिलता है: (तो आप की आवश्यकता हो सकती ग्रहण को पुनः आरंभ और आप परियोजनाओं के पुनर्निर्माण के लिए)

-DtolerateIllegalAmbiguousVarargsInvocation=true 

कहा जा रहा है, सैमुअल सही है: विधि मंगलाचरण अस्पष्ट है। उपरोक्त कोड उदाहरण पहले काम करता था क्योंकि 1.6 से पहले जेडीके में bug था; और ग्रहण में कस्टम कंपाइलर सफलतापूर्वक इस बग की नकल की। जूनो के विकास के दौरान, उन्होंने this bug (क्योंकि जेडीके बग को 1.7 में तय किया गया था) को एक त्रुटि के रूप में अस्पष्ट आमंत्रण की रिपोर्ट करके, बहुत से लोगों (मुझे सहित) परेशान करते हुए तय किया। उपर्युक्त फिक्स आपको स्पष्ट रूप से "अवैध अस्पष्ट वरर्ग आमंत्रण को सहन करने" के लिए ग्रहण करने के लिए कहता है।

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