【问题标题】:Why am I getting an inconvertible type error?为什么我会收到不可转换的类型错误?
【发布时间】:2013-03-24 01:17:59
【问题描述】:

如果我使用这个类:

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

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

【问题讨论】:

  • 你能把你在最后一个代码中得到的错误贴出来吗?
  • @MiguelPrz 在我的代码中,inconvertible type, expected boolean found Object
  • @LoganDam:这是编译时错误吗?在这两种情况下,您是否使用相同的编译器(具有相同的选项)?
  • @JonSkeet 是的。我使用 Netbeans 7.3 作为我的 IDE 并用它编译这两种情况。在第二个示例中,当它警告我编译器错误时,我仍然单击运行,当它最终到达该代码块时,我得到Exception in thread "Thread-3" java.lang.RuntimeException: Uncompilable source code - inconvertible types required: boolean found: java.lang.Object
  • @LoganDam:首先尝试运行带有编译时错误的代码!你确定你的第一个代码编译没有错误吗?

标签: java casting type-conversion


【解决方案1】:

您正在使用不同的编译器选项。你一定是。这两段代码都在 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(基本上是 Java 5 和 6)包括:

铸造上下文允许使用以下之一:

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

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

【讨论】:

  • 我忘记了我在第二个示例中的目标是 Java 6,并且在我的第一个示例中没有更改它。谢谢。
  • 当 Jon Skeet 告诉我我错了时,我知道我一定走错了路 :) 当然,当我实际上在 Eclipse 中扔了两个代码 sn-ps 但通过然后乔恩已经发布了正确的答案。
  • @durron597:如果有什么安慰的话,我只知道这一点,因为几天前有一个类似的问题(但不是完全相同的问题):)
  • @JonSkeet Java 5 中没有引入自动装箱功能吗?这是在 1.7 中修复的自动装箱错误吗?我很难描述我的意思,但这是否意味着在 1.7 之前我不能将 Object 转换为 int
  • @JuanMendes:实际上,我认为这是对 JLS 5.5 节的更改。我在回答中有所不同·
【解决方案2】:

变化:

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

收件人:

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

【讨论】:

  • 对于反对者,我打算使用 Boolean.valueOf 而不是 new Boolean。我的 iPhone 打字速度不够快。
【解决方案3】:

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

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

所以你所做的不能表示为:

boolean result = (boolean) Boolean.TRUE;

解决办法是:

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

【讨论】:

  • 这并不能解释为什么我的第一个示例可以正常工作。
  • @LoganDam 不应该。你确定它有效吗?再试一次。
  • 好吧,并不是每个人都有特权使用最新版本的 Java。
  • @JonSkeet,稍作改动,我们又回到了正轨。使用不同的编译器很好。
  • @JonSkeet Java 7 很可能已经修复了编译器/运行时的问题。谁想要拳击和原始类型?尤克。更多信息:gbracha.blogspot.ru/2009/09/systemic-overload.html
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    使用这个

     Boolean pair = (Boolean)result[1];
    

    【讨论】:

    • 这可能会解决问题,但我的问题不是如何解决,而是首先为什么会出现问题。
    • 第一个示例中存在相同的问题,即对象到原始类型转换错误
    猜你喜欢
    • 2017-01-04
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多