如何从Object获取布尔值

我尝试了不同的方法来解决这个问题,但我无法修复它。 我试图获取在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

你可以做类似的事情,而不是铸造它

  Boolean.parseBoolean(string); 

这是java中Boolean类的一些源代码。

 // 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 } 

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

如果您知道PreferenceCheckBoxPreference ,那么您可以调用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; }