6
votes

Pourquoi est-ce que je reçois une erreur de type inconvertible?

Si j'utilise cette classe: xxx pré>

Ç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


8 commentaires

Pourriez-vous poster l'erreur que vous obtenez dans le dernier code?


@Miguelprez C'était dans mon code, Type inconvertible, objet Boolean trouvé Objet


@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


@Logandam: Bien commencer par pas 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 :)


5 Réponses :



1
votes

Modification: xxx

à: xxx


1 commentaires

Pour les Downvotes, je voulais faire Boolean.Valueof au lieu de nouveau booléen . Je ne pouvais tout simplement pas taper assez vite sur mon iPhone.



0
votes

Utilisez cette

 Boolean pair = (Boolean)result[1];


2 commentaires

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



1
votes

Le problème que vous avez est lié avec autoboxing en Java 1.6

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.

Alors, ce que vous faites ne peut pas être représenté comme:

résultat booléen = (booléen) boolean.true;

Les solutions sont:

  1. Remplacez le tableau d'objets avec une matrice booléenne.
  2. Utilisez boolean.true.equals (résultat [1]) ;
  3. Basculez vers Java 1.7 comme John l'a souligné dans sa réponse.

6 commentaires

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.



8
votes

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


6 commentaires

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 à un int 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 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 ·