2011-03-23 19 views
8

मुझे एक अजीब त्रुटि आई, जो मुझे विश्वास है कि एक बग है। यहाँ एक न्यूनतम मामला है, कोड की उपयोगिता पर टिप्पणी नहीं करते कृपया :)javac अजीब वाक्यविन्यास - त्रुटि अभिव्यक्ति की अवैध शुरुआत

class Foo { 

    static public <X> int bar() { return 42; } 

    public int baz() { 
     return true ? 42 : (
      Foo.<Void>bar() > 42 ? 41 : 43 
     ) 
     ; 
    } 
} 

परिणाम:

err.java:7: illegal start of expression 
     Foo.<Void>bar() > 42 ? 41 : 43 
      ^

मैं रवि एसडीके javac 1.6.0_13 और 1.6.0_21 कोशिश की है।
त्रुटि, चली जाती है जब मैं या तो

  • मेकअप बार() गैर जेनेरिक (बस जिज्ञासा के लिए, वास्तव में एक विकल्प)
  • लाइन पर त्रिगुट अभिव्यक्ति के आसपास कोष्ठक हटाने 7

तो ऐसा लगता है कि एक अभिव्यक्ति है, तो (ई) लिखना हमेशा मान्य नहीं है?

उत्तर

5

पोस्ट कोड को संकलित करता है (और चलाता है) मेरे ग्रहण उपयोग करने के लिए ठीक है, लेकिन मैं इस बात की पुष्टि कर सकते हैं कि javac इसे संकलित करने में विफल रहता है। मुझे संदेह है कि आपको javac में एक कंपाइलर बग मिला है।

यह शायद report it पर एक अच्छा विचार होगा।

+0

धन्यवाद Joachim। यही मुझे डर था (मैं इस समय मानक एसडीके जावैक 1.6 के साथ फंस गया हूं)। यह तय करने के लिए कि क्या यह तय किया गया है, सूर्य/ओरेकल पर बग डेटाबेस खोजना होगा। – Ingo

+1

बग पहले से ही लगभग 3 साल पुराना है, लेकिन स्पष्ट रूप से जेडीके 1.6 में तय नहीं किया जाएगा। हालांकि, यह जेडीके 1.7 बीटा 14 में तय किया गया है (डेवलपर पूर्वावलोकन बी 18 9 है, इसलिए इसे वहां तय किया गया है)। – Ingo

+0

@Ingo: आपको मिली बग का लिंक जोड़ने की परवाह है? –

-3

वापसी मूल्य, आप एक स्थिर विधि को फोन करके यह निर्दिष्ट करने की जरूरत नहीं है:

class Foo { 

    static public <X> int bar() { return 42; } 

    public int baz() { 
     return true ? 42 : (
      Foo.bar() > 42 ? 41 : 43  
     ) 
     ; 
    } 
} 
+0

' घोषित ** ** ** ** ** वापसी मूल्य निर्दिष्ट नहीं करता है, यह यहां तर्क तर्क निर्दिष्ट करता है! –

+0

जैसा कि मैंने व्याख्या करने की कोशिश की, यह कोड पूरी तरह से प्रदर्शन के लिए है। मेरा विश्वास करो, वास्तविक कार्यक्रम में, प्रकार तर्क तर्क अनिवार्य है। – Ingo

1

मैं कोड में थोड़ा बदलाव के साथ संकलित करने में कामयाब रहा। इसलिए, मुझे लगता है कि यह सशर्त ऑपरेटर विनिर्देश (जो थोड़ा जटिल है) या एक बग के साथ कुछ करना है। लेकिन यह समस्या केवल सशर्त ऑपरेटर में होती है।

class Foo { 

    static public <X> int bar() { return 42; } 

    public int baz() { 
     return true ? 42 : (
      ((int)Foo.<Void>bar()) > 42 ? 41 : 43 
     ); 
    } 
} 
+0

कूल! ऐसा लगता है कि संकलक उलझन में है और सोचता है कि "(फू" को कास्ट शुरू करना चाहिए? – Ingo

+0

@ इंगो: आप सही हैं। लेकिन सामान्य दिशानिर्देश 'मिश्रित डेटा प्रकार के साथ सशर्त ऑपरेटर का उपयोग न करें (बस क्योंकि कल्पना थोड़ा जटिल है) 'लेकिन आप इस मामले में मिश्रित प्रकार का उपयोग नहीं कर रहे हैं। –

1

बग पहले से ही कुछ 3 साल पुराना है, लेकिन जाहिर तौर पर जेडीके 1.6 में तय नहीं किया जाएगा। हालांकि, यह जेडीके 1.7 बीटा 14 में तय किया गया है (डेवलपर पूर्वावलोकन बी 185 है, इसलिए यह तय है, मैंने कोशिश की है)।

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