Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从对象中获取布尔值_Java_Classcastexception - Fatal编程技术网

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