如何从对象中获取布尔值

7

我尝试了不同的方法来解决这个问题,但是我无法解决它。我正在尝试获取传递到此复选框方法中的对象的布尔值:

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

1
首先,您假设newValue是Boolean类型。您可以使用instanceof检查newValue的类型。如果它是布尔值,使用自动拆箱,您就没有问题了。如果它是字符串,您可以比较(忽略大小写)"true"、"false"的值,然后创建相应的布尔表示。 - horbags
4个回答

9

你可以尝试以下操作,而不是进行强制类型转换:

 Boolean.parseBoolean(string);

如果需要处理每种情况,您还可以检查 instanceof Boolean 和 instanceof String ... 但这里似乎不需要。 - mothmonsterman
这只接受字符串而不是对象。 - rsavchenko
他似乎主要只处理字符串,因此我的解决方案。 - OmniOwl

4
这是Java中Boolean类的一些源代码。
注:Boolean类是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"时,布尔值才为真。否则它是假的。

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;

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
}

请注意,这个解决方案并不是非常理想且有点脆弱。在某些情况下这是可以接受的,但最好重新评估您方法的输入,使它们更加干净一些。如果您无法这样做,那么上面的代码将起作用。在您的解决方案的背景下,这只是您自己能够决定的问题。


1

如果您知道您的Preference是一个CheckBoxPreference,那么您可以调用isChecked()。它返回一个boolean,而不是Boolean,但这可能已经足够了。

这里是APIDemos设备管理示例(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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接