2011-12-22 16 views
8

क्या कोई यह समझा सकता है कि स्ट्रिंग और कक्षा एनोटेशन पैरामीटर अलग-अलग क्यों अपेक्षित हैं? कंपाइलर को कक्षाओं के लिए अक्षर की आवश्यकता क्यों होती है, वैसे भी स्ट्रिंग्स के लिए स्थिरांक स्वीकार करते हैं?एनोटेशन विशेषता एक कक्षा शाब्दिक होना चाहिए? क्यूं कर? स्थिरांक भी ठीक होना चाहिए

वसंत के @RequestMapping साथ उदाहरण कार्य करना: TestNG के @Test साथ

public class MyController { 
    public static final String REQUEST_MAPPING = "/index.html"; 
    @RequestMapping(MyController.REQUEST_MAPPING) // ALL OK! 
    ... 
} 

WTF उदाहरण:

public class MyControllerTest { 
    public static final Class TEST_EXCEPTION = RuntimeException.class; 
    @Test(expectedExceptions = MyControllerTest.TEST_EXCEPTION) // compilation error, WTF: 
    // The value for annotation attribute Test.expectedExceptions must be a class literal 
    ... 
} 

क्या निश्चित रूप से काम करता है @Test है (expectedExceptions = RuntimeException.class)। पर क्यों? एनोटेशन पैरामीटर में एकमात्र अंतर मैं देखता हूं: स्ट्रिंग बनाम कक्षा। पृथ्वी पर क्यों जावा कंपाइलर स्ट्रिंग निरंतर स्वीकार करता है लेकिन केवल कक्षा अक्षर स्वीकार करता है?

उत्तर

5

जावा भाषा विशिष्टता प्रकार Class के मापदंडों के साथ संकलन समय स्थिरांक उपयोग करने के लिए आप की अनुमति नहीं देता। आप केवल कक्षा अक्षर का उपयोग कर सकते हैं।

JLS एनोटेशन के लिए उपयुक्त पैरामीटर मान के बारे में कहने के लिए निम्न है:

एक तत्व प्रकार टी तत्व का मान वी यदि और केवल यदि निम्न स्थितियों में से कोई एक सही के अनुरूप है ::

  • टी एक सरणी प्रकार ई [] और या तो है
    • वी एक ElementValueArrayInitializer और प्रत्येक ElementValueInitializer (एक सरणी प्रारंभकर्ता में एक चर प्रारंभकर्ता के अनुरूप) वी में के अनुरूप है। या
    • वी एक ElementValue कि टी के अनुरूप है।
  • वी के प्रकार टी और, इसके अलावा के साथ काम संगत (§5.2) है:
    • तो टी एक आदिम प्रकार या स्ट्रिंग है, वी एक निरंतर अभिव्यक्ति (§15.28) है ।
    • वी शून्य नहीं है।
    • अगर टी क्लास, या कक्षा की एक मंगलाचरण है, और वी एक वर्ग शाब्दिक (§15.8.2) है।
    • यदि टी एक enum प्रकार है, और वी एक enum स्थिर है।

यह एक संकलन समय त्रुटि अगर तत्व प्रकार ElementValue के अनुरूप नहीं है।

मैं नहीं कह सकता कि यह प्रतिबंध जेएलएस में क्यों है।

+0

वाह, मैं पूरी तरह से इस बिंदु को याद करता हूं। कक्षा पर यह प्रतिबंध क्यों है? इसे इंगित करने के लिए धन्यवाद। – sibidiba

0

देखो इस:

public static final Class TEST_EXCEPTION = RuntimeException.class; 

वर्ग कि संकलक जाँच करने में सक्षम है एक फेंकने योग्य होना चाहिए। तो, यह प्रयास करें:

public static final Class<? extends Throwable> TEST_EXCEPTION = RuntimeException.class; 
+1

अच्छा विचार लेकिन दुर्भाग्यवश यह वैसे भी काम नहीं करता है। – AlexR

+0

मैंने जानबूझकर जेनरिक छोड़ दिया, यह उससे स्वतंत्र है। – sibidiba

+0

ठीक है, इस मामले में, मुझे नहीं पता। ऐसा लगता है कि यह भाषा की आकस्मिक सीमा है, लेकिन मुझे यकीन नहीं है। :( –

1

मुझे मिल गया "एनोटेशन मूल्य एक वर्ग शाब्दिक होना आवश्यक है" निम्नलिखित पर:

@ServerEndpoint(value="/story/notifications", 
     encoders = (StickerEncoder.class), 
     decoders = (StickerDecoder.class)) 

जबकि WebSockets पर दैवज्ञ ट्यूटोरियल में से एक निम्नलिखित यह हो रहा है। वीडियो को 720p गुणवत्ता नहीं है और अस्पष्टता ब्रेसिज़ ब्रैकेट की तरह दिखने वाली ब्रेसिज़ को छुपाती है। इसलिए ब्रेसिज़ के लिए ब्रैकेट्स (कोष्ठक) को बदलने पर त्रुटि गायब हो जाती है।

@ServerEndpoint(value="/story/notifications", 
     encoders = {StickerEncoder.class}, 
     decoders = {StickerDecoder.class}) 

कोई भी जो भविष्य में उसी पर यात्रा कर सकता है।

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