我尝试了不同的方法来解决这个问题,但我无法修复它。我想在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
答案 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)
如果您知道Preference
是CheckBoxPreference
,那么您可以致电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;
}