Java 如何从对象中获取布尔值
我尝试了不同的方法来解决这个问题,但我无法解决它。我试图获取在复选框的此方法中传递的对象的布尔值:Java 如何从对象中获取布尔值,java,classcastexception,Java,Classcastexception,我尝试了不同的方法来解决这个问题,但我无法解决它。我试图获取在复选框的此方法中传递的对象的布尔值: public boolean onPreferenceChange(Preference preference, Object newValue) { final String key = preference.getKey(); referenceKey=key; Boolean changedValue=!(((Boolean)newValue).booleanVal
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
你可以做一些事情,比如
Boolean.parseBoolean(string);
下面是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;
从您发布的代码和您看到的结果来看,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
}
请注意,此解决方案并不理想,而且有些脆弱。在某些情况下,这是可以的,但最好重新评估方法的输入,使它们更干净一些。如果不能,那么上面的代码就可以工作了。这确实是只有您才能在解决方案的上下文中决定的事情。如果您知道您的
首选项是复选框首选项
,那么您可以调用。它返回一个布尔值
,而不是布尔值
,但这可能已经足够接近了
下面是示例(DeviceAdminSample.java)中的一些代码
如果需要处理每种情况,还可以检查instanceof Boolean和instanceof String。。。但这里看起来不是这样,这只接受字符串而不是对象,他几乎只处理字符串,所以我的解决方案是这样的。您可以使用instanceof检查newValue的类型。如果是布尔值,使用自动取消装箱,则没有问题。如果是字符串,则可以比较(忽略大小写)值“true”、“false”,然后创建相应的布尔表示。
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;
}