在 Bundle 中,如何找出给定键的值的类型?

n61*_*007 7 java primitive android bundle android-intent

我是 Android/Java 新手。我想编写一个测试应用程序,其中打印我添加到(自定义)意图的任何任意额外内容。当我收到我的意图时BroadcastReceiver,我可以通过以下方式获取所有额外的捆绑及其密钥:

Bundle bundle = intent.getExtras();
Set<String> keys = bundle.keySet();
Run Code Online (Sandbox Code Playgroud)

如何找出与给定键关联的值的类型?

我的想法是这样的:

Object tmp = bundle.get(key);
// utilize /sf/ask/49697301/
Run Code Online (Sandbox Code Playgroud)

但这种方式似乎并不是最好的主意。另一种选择似乎是这样的:

if (bundle.getBoolean(key) == null) {
    // can't determine if `null` was explicitly associated or not
} else if /* ... */
Run Code Online (Sandbox Code Playgroud)

但这样我就无法确定空值是否是有意的。我可以创建一个自定义默认值类,但我不确定这是预期的方式。 编辑我刚刚意识到我需要相同类型的默认值,所以我什至不能这样做。(不过,可以仔细检查 null 和自定义默认类型值来了解。)

如何动态知道给定键的值的类型?

Jua*_*gcg 6

也许我应该通过比评论更好的答案来更好地解释我。

你可以做你想做的事。

Object tmp = bundle.get(key);
if (tmp instanceof Boolean) {
    boolean finalValue = ((Boolean)tmp).booleanValue();
}
Run Code Online (Sandbox Code Playgroud)

如果你检查 Android 的源代码,你会看到类似的东西,它们总是传递包装器而不是原始类型。

public boolean More ...getBoolean(String key, boolean defaultValue) {
    Object o = mMap.get(key);
    if (o == null) {
        return defaultValue;
    }
    try {
        return (Boolean) o;
    } catch (ClassCastException e) {
        typeWarning(key, o, "Boolean", defaultValue, e);
        return defaultValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

不同之处在于,他们不检查对象的类型,因为他们认为您知道自己在做什么。

来源