如果我使用这个课程:
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
据我所知,我在两种情况下都做同样的事情,但第一个例子编译得很好而第二个例子没有。
答案 0 :(得分: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节中。
投射上下文允许使用以下之一:
- ...
- 缩小引用转换(第5.1.6节),可选地后跟取消装箱转换(第5.1.8节)或未经检查的转换(第5.1.9节)
JLS 3rd edition(基本上是Java 5和6)包括:
投射上下文允许使用以下之一:
- ...
- 缩小参考转换(第5.1.6节),可选地后跟未经检查的转换
请注意那里没有“拆箱转换”。
答案 1 :(得分:1)
变化:
result[1] = (boolean)checkbox.isSelected();
要:
result[1] = Boolean.valueOf(checkbox.isSelected());
答案 2 :(得分:1)
您遇到的问题与Java 1.6中的Autoboxing
有关您将原始类型放入Object数组中。 Java不能将原语与Object混合,因此它将原始布尔值包装成布尔值。
所以你所做的事情不能表现为:
boolean result = (boolean) Boolean.TRUE;
解决方案是:
Boolean.TRUE.equals(result[1])
; 答案 3 :(得分:0)
尝试通过Boolean更改布尔值,这是一个来自java.lang.Object的类,你有Boolean.TRUE和Boolean.FALSE
答案 4 :(得分:0)
使用此
Boolean pair = (Boolean)result[1];