有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

Bundle bundle = intent.getExtras();
Set<String> keys = bundle.keySet();

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

我当时的想法是:

Object tmp = bundle.get(key);
// utilize https://stackoverflow.com/questions/709961/

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

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

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

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


共 (3) 个答案

  1. # 1 楼答案

    这是一个老问题,但我给了他一个优雅的新解决方案

        //@ Dump key types in bundle
       void showKeyTypesInBundle(
                Bundle bundle)  // bundle to query
        {
            // Notes:
            // 'print()' is my output function (e.g. Log.i).
            // keys with null values are not shown.
    
            int size;
            Set<String> ks = bundle.keySet();   // get keys in bundle
            size = ks.size();                   // get key count
    
            print( "KEYS IN BUNDLE:" );
            if( size > 0 ) {                    // any keys in bundle?
                for (String key : ks ) {        // for every key in keyset...
                    String type = getKeyType(bundle, key);  // get type
                    print("  key \"" + key + "\": type =\"" + type + "\"");
                }
            }
            else {                               // no keys in bundle?
                print( "  No Keys found" );
            }
            print( "END BUNDLE." );
        }
    
        //@ Get type of bundle key
        String getKeyType(
                Bundle bundle,  // bundle containing key
                String key)     // key name
    
        {
            Object keyobj;
            String type;
    
            if( bundle == null || key == null ) return( null );     // bad call/
    
            keyobj = bundle.get( key );                             // get key as object
            if( keyobj == null ) return( null );                    // not present?
            type = keyobj.getClass().getName();                     // get class name
            return( type );
            // Returns name of key value type
            // e.g. "java.lang.String" or "java.lang.Integer"
            // or null on error        }
        }
    

    如果需要,可以调用bundle。基于类型获取xxx,例如bundle。如果类型为“java.lang.String”,则为getString()

  2. # 2 楼答案

    我相信您无法确定类型,如果您发送了意图,那么您知道要接收什么,如果您从其他应用程序接收到意图,请阅读他们的文档。如果他们想让你使用它,他们会记录它:)

  3. # 3 楼答案

    也许我应该通过回答而不是评论来更好地解释我

    你可以做你想做的事

    Object tmp = bundle.get(key);
    if (tmp instanceof Boolean) {
        boolean finalValue = ((Boolean)tmp).booleanValue();
    }
    

    如果你检查来自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;
        }
    }
    

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

    source