2013-04-02 13 views
6

अगर मैं इस वर्ग का उपयोग करें:मुझे एक अपरिवर्तनीय प्रकार त्रुटि क्यों मिल रही है?

public class BooleanTest { 
    public static void main(String args[]) { 
     final Object[] objarray = new Object[2]; 
     try { 
      objarray[0] = "Hello World!"; 
      objarray[1] = false; 
     } catch (NullPointerException e) { 
     } 
     boolean bool = (boolean) objarray[1]; 
    } 
} 

यह ठीक काम करता है और मुझे लगता है कि boolean कोई समस्या नहीं प्रदान कर सकते हैं। पासवर्ड के लिए मेरे उपयोगकर्ता से पूछते समय मैं वही काम क्यों नहीं कर सकता?

final Object result[] = new Object[2]; 
try { 
    java.awt.EventQueue.invokeAndWait(new Runnable() { 
     @Override 
     public void run() { 
      JPanel panel = new JPanel(); 
      panel.setLayout(new GridLayout(3,0)); 
      JLabel label = new JLabel(); 

      label.setHorizontalAlignment(SwingConstants.LEADING); 
      JTextField input = new JTextField(); 

      input.setHorizontalAlignment(SwingConstants.CENTER); 
      JCheckBox checkbox = new JCheckBox("Pair with this device"); 
      checkbox.setHorizontalAlignment(SwingConstants.LEADING); 
      panel.add(label); 
      panel.add(input); 
      panel.add(checkbox); 
      if (wrong) { 
       label.setText("Wrong password. Please enter the password from the other device:"); 
      } else { 
       label.setText("Please enter the password from the other device:"); 
      } 
      int response = JOptionPane.showConfirmDialog(SendGUI.this, panel, "Enter password", JOptionPane.OK_CANCEL_OPTION); 
      if (response == JOptionPane.OK_OPTION) { 
       result[0] = input.getText(); 
       result[1] = (boolean)checkbox.isSelected(); 
      } else { 
       result[0] = null; 
       result[1] = false; 
      } 
     } 
    }); 
} catch (InterruptedException e) { 
} catch (InvocationTargetException e) { 
} 
boolean pair = (boolean)result[1]; //inconvertible type, expected boolean found Object 

जहां तक ​​मुझे लगता है मैं दोनों ही मामलों में ही बात कर रहा हूँ, लेकिन, जबकि दूसरा उदाहरण नहीं है पहला उदाहरण ठीक संकलित देख सकते हैं। Boolean द्वारा बूलियन बदलने के लिए

+3

क्या आप अंतिम कोड में प्राप्त त्रुटि पोस्ट कर सकते हैं? –

+1

@MiguelPrz यह मेरे कोड में था, 'अपरिवर्तनीय प्रकार, अपेक्षित बूलियन ऑब्जेक्ट' – Logan

+0

@LoganDam: क्या यह संकलन-समय त्रुटि है? क्या आप दोनों मामलों में एक ही कंपाइलर (एक ही विकल्प के साथ) का उपयोग कर रहे हैं? –

उत्तर

8

आप विभिन्न कंपाइलर विकल्पों का उपयोग कर रहे हैं। आपको होना चाहिए। जावा 7 नियमों के तहत कोड संकलित दोनों टुकड़े; न तो जावा 6 नियमों के तहत संकलित करता है। उदाहरण के लिए, अपने पहले कोड का टुकड़ा (एक है कि आप के लिए compiles कहते हैं) ले जा रहा:

c:\Users\Jon\Test>javac -source 1.7 BooleanTest.java 

(No console output, i.e. no errors) 

c:\Users\Jon\Test>javac -source 1.6 BooleanTest.java 
warning: [options] bootstrap class path not set in conjunction with -source 1.6 
BooleanTest.java:10: error: inconvertible types 
     boolean bool = (boolean) objarray[1]; 
             ^
    required: boolean 
    found: Object 
1 error 
1 warning 

संपादित करें: मेरा मानना ​​है कि परिवर्तन JLS (कास्टिंग रूपांतरण) की धारा 5.5 में है।

Java 7 version में शामिल हैं:

  • ...
  • एक संकुचन संदर्भ रूपांतरण (§5.1.6) वैकल्पिक रूप से या तो एक के बाद:

    कास्टिंग संदर्भों में से एक के उपयोग की अनुमति अनबॉक्सिंग रूपांतरण (§5.1.8) या एक अनचेक रूपांतरण (§5.1।9)

JLS 3rd edition (जावा 5 और 6, मूल रूप से) में शामिल हैं:

  • ...
  • एक:

    कास्टिंग संदर्भों में से एक के उपयोग की अनुमति संकुचित संदर्भ रूपांतरण (§5.1.6) वैकल्पिक रूप से एक अनचेक रूपांतरण

वहां "एक अनबॉक्सिंग रूपांतरण" की कमी पर ध्यान दें।

+0

मैं भूल गया था कि मैं अपने दूसरे उदाहरण में जावा 6 को लक्षित कर रहा था और इसे मेरे पहले उदाहरण में नहीं बदला। धन्यवाद। – Logan

+0

मुझे पता था कि जब मैं जॉन स्कीट मुझे बताता है तो मैं गलत गलत ट्रैक पर रहा हूं :) निश्चित रूप से मैंने इसे समझ लिया जब मैंने वास्तव में ग्रहण में दोनों कोड स्निपेट फेंक दिए लेकिन तब तक जॉन पहले ही सही जवाब पोस्ट कर चुका था। – durron597

+0

@ durron597: अगर यह कोई सांत्वना है, तो मुझे केवल यह पता था क्योंकि कुछ दिन पहले एक समान प्रश्न (लेकिन सटीक डुप्लिकेट नहीं था) :) –

0

कोशिश है, जो इसे एक वर्ग है कि java.lang.Object से inhereits है और आपके पास Boolean.TRUE और Boolean.FALSE

1

बदलें:

result[1] = (boolean)checkbox.isSelected(); 

करने के लिए:

result[1] = Boolean.valueOf(checkbox.isSelected()); 
+0

डाउनवॉटर के लिए मुझे 'नया बूलियन' के बजाय बूलियन.वैल्यू करना था। मैं बस अपने आईफोन पर पर्याप्त तेज़ी से टाइप नहीं कर सका। –

0

उपयोग इस

Boolean pair = (Boolean)result[1]; 
+0

यह समस्या को ठीक कर सकता है लेकिन मेरा सवाल यह नहीं है कि इसे कैसे ठीक किया जाए और इसके बजाय यह पहली जगह क्यों है। – Logan

+0

आपके पहले उदाहरण में एक ही समस्या है i.e. ऑब्जेक्ट आदिम प्रकार रूपांतरण त्रुटि – Biswajit

1

आपके पास समस्या है Autoboxing जावा 1.6

आप ऑब्जेक्ट सरणी में एक आदिम प्रकार डालते हैं। जावा ऑब्जेक्ट के साथ आदिम मिश्रण नहीं कर सकता है, इसलिए यह उस जूलियन को बुलीयन में लपेटता है।

boolean result = (boolean) Boolean.TRUE;

समाधान कर रहे हैं:

  1. बूलियन सरणी के साथ वस्तु सरणी बदलें

    तो तुम क्या कर रहे के रूप में प्रतिनिधित्व नहीं किया जा सकता।

  2. Boolean.TRUE.equals(result[1]) का उपयोग करें;
  3. जावा 1.7 पर स्विच करें क्योंकि जॉन ने अपने जवाब में बताया था।
+0

यह समझा नहीं है कि मेरा पहला उदाहरण त्रुटि के बिना क्यों काम करता है। – Logan

+0

@LoganDam यह नहीं होना चाहिए। क्या आपको यकीन है कि यह काम करता है? बस पुनः प्रयास करें। –

+0

कोड के दोनों टुकड़े जावा 7 के तहत ठीक हैं। वास्तव में, वास्तव में :) –

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