2013-04-02 55 views
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 

至于我可以看到我在做同样的事情在这两种情况下,但第一个例子,而第二个示例不编译罚款。

+3

你能发布你在上一个代码中得到的错误吗? –

+1

@MiguelPrz它是在我的代码中,'inconvertible类型,期望布尔发现对象' – Logan

+0

@LoganDam:这是一个编译时错误?你是否在两种情况下使用相同的编译器(具有相同的选项)? –

回答

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 version包括:

铸造上下文允许使用中的一种:

  • ...
  • 变窄引用转换(第5.1.6节)任选地随后的任一取消装箱转换(§5.1.8)或未经检查的转换(§5.1。9)

JLS 3rd edition(爪哇5和6,基本上)包括:

铸造上下文允许使用中的一种:

  • ...
  • 一个缩小参考转换(§5.1.6),然后可选择非选中转换

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

+0

我忘记了我在第二个示例中针对Java 6,并没有在第一个示例中更改它。谢谢。 – Logan

+0

当Jon Skeet告诉我我错了的时候,我知道我一直在完全错误的轨道上:)当然,当我将其中的两个代码片段都扔进Eclipse时,我明白了这一点,但是Jon已经发布了正确的答案。 – durron597

+0

@ durron597:如果是任何安慰,我只知道这个,因为前几天有类似的问题(但不是一个确切的副本):) –

0

尝试通过Boolean改变布尔值,它是从java.lang.Object继承inhereits一类,你有Boolean.TRUE和Boolean.FALSE

1

变化:

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

要:

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

对于downvoters我打算做Boolean.valueOf而不是'new Boolean'。我无法在我的iPhone上输入足够的速度。 –

0

使用此

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

这可能会解决问题,但我的问题不是如何解决问题,而是为什么它首先是一个问题。 – Logan

+0

在你的第一个例子中有同样的问题,即对象到原始类型转换错误 – Biswajit

1

您所遇到的问题与Java 1.6中的Autoboxing有关。

您将原始类型放入Object数组中。 Java不能与Object混合原语,因此它将该原始布尔值包裹为布尔值。

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

boolean result = (boolean) Boolean.TRUE;

的解决方案是:

  1. 替换布尔数组对象数组。
  2. 使用Boolean.TRUE.equals(result[1]);
  3. John在他的回答中指出,切换到Java 1.7。
+0

这并不能解释为什么我的第一个例子没有错误。 – Logan

+0

@LoganDam它不应该。你确定它有效吗?再试一次。 –

+0

这两段代码在Java 7下都很好。真的,真的:) –

相关问题