2013-04-02 31 views
6

Se uso questa classe:Perché sto ottenendo un errore di tipo inconvertibile?

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]; 
    } 
} 

Funziona benissimo e posso assegnare tale boolean nessun problema. Perché non posso fare la stessa cosa quando chiedo al mio utente una password?

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 

Per quanto posso vedere che sto facendo la stessa cosa in entrambi i casi, ma il primo esempio compila bene, mentre il secondo esempio non lo fa.

+3

potresti pubblicare l'errore che ottieni nell'ultimo codice? –

+1

@MiguelPrz era nel mio codice, 'tipo non convertibile, oggetto trovato booleano atteso – Logan

+0

@LoganDam: Si tratta di un errore in fase di compilazione? Stai usando lo stesso compilatore (con le stesse opzioni) in entrambi i casi? –

risposta

8

Stai utilizzando diverse opzioni del compilatore. Devi essere. Entrambi i pezzi di codice vengono compilati con le regole di Java 7; né compila sotto le regole di Java 6. Ad esempio, prendendo il vostro prima pezzo di codice (quello che dici compilazioni per voi):

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 

EDIT: Credo che il cambiamento è nella sezione 5.5 delle (conversioni Casting) JLS.

Il Java 7 version include:

contesti Casting consentono l'uso di uno di:

  • ...
  • una conversione riferimento restringimento (§5.1.6) facoltativamente seguito da un conversione unboxing (§5.1.8) o una conversione non controllata (§5.1.9)

Il JLS 3rd edition (Java 5 e 6, in fondo) include:

contesti Casting permettono l'uso di uno dei seguenti:

  • ...
  • un conversione di riferimento restrittiva (§5.1.6) opzionalmente seguita da una conversione non controllata

Nota la mancanza di "una conversione unboxing" lì.

+0

Avevo dimenticato di puntare a Java 6 nel mio secondo esempio e non l'ho modificato nel mio primo esempio. Grazie. – Logan

+0

Sapevo che dovevo essere sulla strada sbagliata quando Jon Skeet mi dice che ho torto :) Ovviamente l'ho capito quando ho buttato entrambi i frammenti di codice in Eclipse, ma a quel punto Jon aveva già postato la risposta corretta. – durron597

+0

@ durron597: Se c'è qualche consolazione, lo sapevo solo perché c'era una domanda simile (ma non un duplicato esatto) qualche giorno fa :) –

0

tenta di modificare la booleano da Boolean, che è una classe che inhereits da java.lang.Object e si ha la Boolean.TRUE e Boolean.FALSE

1

Cambio:

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

A:

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

Per i downvoters intendevo fare Boolean.valueOf invece di 'new Boolean'. Non potevo digitare abbastanza velocemente sul mio iPhone. –

0

Utilizzare questa

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

Questo potrebbe risolvere il problema ma la mia domanda non è come risolverlo e piuttosto perché è un problema in primo luogo. – Logan

+0

c'è lo stesso problema nel tuo primo esempio, errore di conversione del tipo di oggetto primitivo – Biswajit

1

Il problema riscontrato è relativo a Autoboxing in Java 1.6

Si inserisce un tipo primitivo nell'array di oggetti. Java non può combinare la primitiva con Object, quindi avvolge quel primitivo booleano in Boolean.

Quindi quello che stai facendo non può essere rappresentato come:

boolean result = (boolean) Boolean.TRUE;

Le soluzioni sono:

  1. Sostituire la matrice Object con l'allineamento booleano.
  2. Utilizzare Boolean.TRUE.equals(result[1]);
  3. Passare a Java 1.7 come Giovanni ha sottolineato nella sua risposta.
+0

Questo non spiega perché il mio primo esempio funziona senza errori. – Logan

+0

@LoganDam Non dovrebbe. Sei sicuro che funzioni? Riprova. –

+0

Entrambi i pezzi di codice vanno bene con Java 7. Davvero, veramente :) –

Problemi correlati