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

据我所见,我在这两种情况下都在做同样的事情,但是第一个例子编译得很好,而第二个例子没有。

4

5 回答 5

8

您正在使用不同的编译器选项。你一定是。这两段代码都在 Java 7 规则下编译;两者都不能在 Java 6 规则下编译。例如,获取您的第一段代码(您所说的为您编译的代码):

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 版本包括:

强制转换上下文允许使用以下之一:

  • ...
  • 缩小参考转换(第 5.1.6 节)可选地后跟取消装箱转换(第 5.1.8 节)或未经检查的转换(第 5.1.9 节)

JLS 第 3 版(基本上是 Java 5 和 6)包括:

强制转换上下文允许使用以下之一:

  • ...
  • 缩小参考转换(第 5.1.6 节)可选地后跟未经检查的转换

请注意那里缺少“拆箱转换”。

于 2013-04-02T16:42:13.703 回答
1

改变:

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

到:

result[1] = Boolean.valueOf(checkbox.isSelected());
于 2013-04-02T16:32:28.030 回答
1

您遇到的问题与Java 1.6中的自动装箱有关

您将原始类型放入 Object 数组中。Java 不能将原始与对象混合,因此它将原始布尔值包装成布尔值。

所以你在做什么不能表示为:

boolean result = (boolean) Boolean.TRUE;

解决方案是:

  1. 将 Object 数组替换为布尔数组。
  2. 使用Boolean.TRUE.equals(result[1])
  3. 正如约翰在回答中指出的那样,切换到 Java 1.7。
于 2013-04-02T16:35:14.947 回答
0

尝试通过Boolean更改布尔值,这是一个继承自 java.lang.Object 的类,并且您拥有 Boolean.TRUE 和 Boolean.FALSE

于 2013-04-02T16:31:18.677 回答
0

用这个

 Boolean pair = (Boolean)result[1];
于 2013-04-02T16:32:36.610 回答