如何从Object获取布尔值

时间:2012-05-17 20:03:43

标签: java classcastexception

我尝试了不同的方法来解决这个问题,但我无法修复它。我想在checkBox的这个方法中传递一个 Object 的布尔值:

public boolean onPreferenceChange(Preference preference, Object newValue) 
{
    final String key = preference.getKey();
    referenceKey=key;
    Boolean changedValue=!(((Boolean)newValue).booleanValue()); //ClassCastException occurs here
}

我明白了:

  

java.lang.ClassCastException:java.lang.String无法强制转换为java.lang.Boolean

4 个答案:

答案 0 :(得分:9)

您可以执行类似

的操作,而不是强制转换它
 Boolean.parseBoolean(string);

答案 1 :(得分:4)

以下是java中布尔类的一些源代码。

// Boolean Constructor for String types.
public Boolean(String s) {
    this(toBoolean(s));
}
// parser.
public static boolean parseBoolean(String s) {
    return toBoolean(s);
}
// ...
// Here's the source for toBoolean.
// ...
private static boolean toBoolean(String name) { 
    return ((name != null) && name.equalsIgnoreCase("true"));
}

正如您所看到的,您需要传递一个值为“true”的字符串,以使布尔值为true。否则就是假的。

assert new Boolean( "ok" ) == false; 
assert new Boolean( "True" ) == true;
assert new Boolean( "false" ) == false;

assert Boolean.parseBoolean( "ok" ) == false; 
assert Boolean.parseBoolean( "True" ) == true;
assert Boolean.parseBoolean( "false" ) == false;

答案 2 :(得分:3)

根据您发布的代码和您看到的结果,看起来newValue不是布尔值。所以你试图转换为布尔值,但它不是一个,所以发生错误。

目前尚不清楚你要做什么。理想情况下,你将newValue作为布尔值。如果你不能这样做,这应该有效:

boolean newValue;
if (newValue instanceof Boolean) { 
    changedValue = newValue; // autoboxing handles this for you
} else if (newValue instanceof String) {
    changedValue = Boolean.parseBoolean(newValue);
} else { 
    // handle other object types here, in a similar fashion to above
}

请注意,这个解决方案并不是很理想,而且有些脆弱。在某些情况下可以,但最好重新评估方法的输入,使它们更清洁一些。如果你不能,那么上面的代码将起作用。这真的只有你可以在解决方案的背景下决定。

答案 3 :(得分:1)

如果您知道PreferenceCheckBoxPreference,那么您可以致电isChecked()。它返回boolean,而不是Boolean,但这可能足够接近。

以下是APIDemos Device Administration示例(DeviceAdminSample.java)中的一些代码。

private CheckBoxPreference mDisableCameraCheckbox;

public void onResume() {
    ...
    mDPM.setCameraDisabled(mDeviceAdminSample, mDisableCameraCheckbox.isChecked());
    ...
}

public boolean onPreferenceChange(Preference preference, Object newValue) {
...
    boolean value = (Boolean) newValue;
...
    else if (preference == mDisableCameraCheckbox) {
        mDPM.setCameraDisabled(mDeviceAdminSample, value);
        reloadSummaries();
    }
    return true;
}