Si j'utilise cette classe: Ça fonctionne bien et je peux affecter ce booléen code> aucun problème. Pourquoi ne puis-je pas faire la même chose lors de la poser à mon utilisateur d'un mot de passe? P>
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
5 Réponses :
essayer de changer le booléen par boolean a >, que c'est une classe qui émet de java.lang.Object et vous avez le booléen.True et boolean.false p>
Modification: à: p>
Pour les Downvotes, je voulais faire Boolean.Valueof au lieu de nouveau booléen code>. Je ne pouvais tout simplement pas taper assez vite sur mon iPhone.
Utilisez cette
Boolean pair = (Boolean)result[1];
Cela peut résoudre le problème, mais ma question n'est pas de savoir comment le corriger et plutôt pourquoi est-ce un problème en premier lieu.
Il y a le même problème dans votre premier exemple I.e. objet à une erreur de conversion de type primitive
Le problème que vous avez est lié avec autoboxing en Java 1.6 p>
Vous mettez un type primitif dans une matrice d'objet. Java ne peut pas mélanger primitif avec un objet, il enveloppe donc cette primitive booléenne en booléen. p>
Alors, ce que vous faites ne peut pas être représenté comme: p>
Les solutions sont: p>
résultat booléen = (booléen) boolean.true; code> p>
boolean.true.equals (résultat [1]) code>; li>
Cela n'explique pas pourquoi mon premier exemple fonctionne sans erreur.
@Logandam Ça ne devrait pas. Êtes-vous sûr ça marche? Juste réessayer.
Tout le monde n'a pas de privilège de travailler sur la dernière version de Java.
@Jonskeet, de petits changements et nous sommes à nouveau sur la bonne voie. Belle prise avec ces différents compilateurs.
@ Jonskeet Le plus probablement que Java 7 a réparer le problème dans le compilateur / runtime. Qui veut de la boxe et du type primitif? Yurk. Plus à propos de celui-ci: GBRACHA.BLOGSPOT.RU/2009/09/Systemicoverload. HTML
@Logandam Cela explique pourquoi votre premier extrait fonctionne. À cause de l'autoboxage. Et votre deuxième extrait ne fonctionne pas à cause d'un bug dans le compilateur / runtime.
Vous utilisez différentes options de compilateur. Tu dois être. Les deux pièces de code compilent sous les règles Java 7; ni ne compile dans les règles de Java 6. Par exemple, prenez votre premier em> la pièce de code (celui que vous dites compile pour vous): 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
J'avais oublié que je visais Java 6 dans mon deuxième exemple et je n'ai pas changé cela dans mon premier exemple. Merci.
Je savais que j'ai dû être sur la mauvaise piste totale lorsque Jon Skeet me dit que je me trompe :) Bien sûr, je l'ai compris lorsque je les ai lancés lorsque je les ai lancés à la fois à Eclipse mais que Jon avait déjà posté la bonne réponse.
@ Durron597: Si c'est une consolation, je ne savais que ceci car il y avait une question similaire (mais pas un double exact) il y a quelques jours :)
@Jonskeet n'était pas autoboxal introduit dans Java 5? Était-ce un bogue en autoboxage qui a été corrigé en 1.7? Je suis difficile de décrire ce que je veux dire, mais cela signifie-t-il que je ne peux pas lancer un objet code> à un
int code> jusqu'à 1.7?
@JuanMendes: Oui, AutoBoxing a été introduit dans Java 5 - mais la nature exacte de l'autoboxage et de la transboxication a été modifiée dans Java 7. Il y avait une modification de la spécification de langue, ou c'était un bogue dans le compilateur Java 6. Je ne voudrais pas dire quoi, pour être honnête - mais je Suspect i> C'est une modification de la langue de la langue.
@JuanMendes: En fait, je pense que c'est un changement de la section 5.5 de la JLS. Je mets la différence dans ma réponse ·
Pourriez-vous poster l'erreur que vous obtenez dans le dernier code?
@Miguelprez C'était dans mon code,
Type inconvertible, objet Boolean trouvé Objet Code>
@Logandam: Est-ce une erreur de compilation? Utilisez-vous le même compilateur (avec les mêmes options) dans les deux cas?
@Jonskeet Oui. J'utilise NetBeans 7.3 comme mon IDE et compilez les deux cas avec elle. Dans le deuxième exemple, je clique de toute façon quand il me met en garde sur l'erreur du compilateur, et quand il atteint finalement ce bloc de code, j'obtiens
Exception dans le thread "thread-3" java.lang.runtimeException: code source inabilable - inconvertible Types requis: Boolean trouvé: java.lang.Object code>
@Logandam: Bien commencer par pas i> essayer de lancer le code avec des erreurs de compilation! Êtes-vous certain que votre premier code compile sans erreur?
@Jonskeet Oui, je suis sûr à 100%. Vous pouvez la compiler et essayer vous-même.
@Logandam: La chose est, je m'attends à ce qu'elle compile avec Java 6 options mais pas avec les options Java 7 ... C'est pourquoi j'ai explicitement dit "avec les mêmes options".
@Jonskeet Aha, j'ai oublié celui qui a été mis sur la ciblage Java 6. Faites une réponse à ce sujet et je l'accepterai. Mon erreur, merci beaucoup :)