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

私が見る限り、どちらの場合も同じことをしていますが、最初の例は正常にコンパイルされますが、2 番目の例はそうではありません。

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.8) または非チェック変換 (§5.1.9) のいずれかが続く縮小参照変換 (§5.1.6)

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. オブジェクト配列をブール配列に置き換えます。
  2. 使用しBoolean.TRUE.equals(result[1])ます。
  3. John が回答で指摘したように、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 に答える