【问题标题】:Class java.util.Map has generic type parameters, please use GenericTypeIndicator instead类 java.util.Map 具有泛型类型参数,请改用 GenericTypeIndicator
【发布时间】:2016-10-07 20:49:26
【问题描述】:

我正在使用 firebase 从数据库中检索数据 n 使用

Map<String, String> map = dataSnapshot.getValue(Map.class);

获取值,但显示错误

E/AndroidRuntime: FATAL EXCEPTION: main
                                                                 Process: com.rana.sahaj.myyu, PID: 13179
                                                                 com.google.firebase.database.DatabaseException: Class java.util.Map has generic type parameters, please use GenericTypeIndicator instead
                                                                     at com.google.android.gms.internal.zzaix.zzb(Unknown Source)
                                                                     at com.google.android.gms.internal.zzaix.zza(Unknown Source)
                                                                     at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
                                                                     at com.rana.sahaj.myyu.profile.Profile$2.onDataChange(Profile.java:158)
                                                                     at com.google.android.gms.internal.zzafp.zza(Unknown Source)
                                                                     at com.google.android.gms.internal.zzagp.zzSu(Unknown Source)
                                                                     at com.google.android.gms.internal.zzags$1.run(Unknown Source)
                                                                     at android.os.Handler.handleCallback(Handler.java:733)
                                                                     at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                     at android.os.Looper.loop(Looper.java:136)
                                                                     at android.app.ActivityThread.main(ActivityThread.java:5052)
                                                                     at java.lang.reflect.Method.invokeNative(Native Method)
                                                                     at java.lang.reflect.Method.invoke(Method.java:515)
                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
                                                                     at dalvik.system.NativeStart.main(Native Method)

这是代码

 DatabaseReference profileRef=mFirebaseRef.child(EEmail);
    profileRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

    -->     Map<String, String> map = (Map<String,String>)dataSnapshot.getValue(Map.class);

            name = (TextView)findViewById(R.id.UserInActivity);
            EmailView= (TextView)findViewById(R.id.emailUser);

            PhotoUrl = map.get("picurl");
             emmaill=map.get("userEmail");

            UserNam = map.get("userNAME");

            name.setText(UserNam);
            EmailView.setText(emmaill);


        }

        @Override
        public void onCancelled(DatabaseError firebaseError) {

        }
    });

n 数据库中的键 n 值没有问题。 使用了解决方案但不起作用

【问题讨论】:

    标签: android dictionary firebase firebase-realtime-database


    【解决方案1】:

    错误正确地指出了你出错的地方

     Map<String, String> map = dataSnapshot.getValue(Map.class);
    

    Map 类使用参数来定义 Key 和 Object 的类型,因为您没有提供它们,而只是使用 Map.class 失败。

    试试下面的代码 - 因为 Key 总是字符串,我们可以为它们设置任何类型的 Object

        Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
    

    【讨论】:

    • 你能用你使用的新代码更新你的问题吗?
    • 使用getValue()你还在做getValue(Map.class);
    • 在下面查看我的正确答案。因为这里没有解决方案对我有用
    • 现在出现此错误 java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map
    【解决方案2】:

    要引入GenericTypeIndicator,可以改这行:

    Map<String, String> map = dataSnapshot.getValue(Map.class);
    

    到这里:

    GenericTypeIndicator<Map<String, String>> genericTypeIndicator = new GenericTypeIndicator<Map<String, String>>() {};
    Map<String, String> map = dataSnapshot.getValue(genericTypeIndicator );
    

    这应该适用于您的情况。请试一试并告诉我。

    【讨论】:

    • Map&lt;String, String&gt; map = (Map&lt;String, Object&gt;) dataSnapshot.getValue(); 应该有效。但无论如何,我已经更新了答案以显示如何使用GenericTypeIndicator - 你可以试试这个 - 我希望有人也能发现这有帮助。
    • 谢谢,这行得通,而接受的答案却没有。
    • 现在出现这个错误 com.google.firebase.database.DatabaseException: Expected a Map while deserializing, but got a class java.lang.Stri
    【解决方案3】:

    我遇到了同样的问题,并通过处理对象而不是尝试让 Firebase 投射它来解决它。

    Map <String, String> map = (Map)dataSnapshot.getValue();
    

    为我做的。

    【讨论】:

    • 也为我工作。不错的解决方案!
    • 谢谢!!为我工作。
    【解决方案4】:

    你需要使用getCheldrin如下

    for (DataSnapshot snapshotNode: dataSnapshot.getChildren()) {
        map.put(snapshotNode.getKey(), snapshotNode.getValue(YOUR_CLASS_TYPE.class));
    }
    

    YOUR_CLASS_TYPE 替换为您期望的类类型。注意这个类必须有一个空的构造函数。

    【讨论】:

      【解决方案5】:

      由于 Java 实现泛型的方式(类型擦除),有必要使用稍微复杂一点的方法在运行时正确解析泛型集合的类型。为了解决这个问题,Firebase 数据库在调用 getValue (getValue(GenericTypeIndicator), getValue(GenericTypeIndicator)) 时接受该类的子类,并返回一个类型正确的泛型集合。

      例如,您可以执行以下操作从 DataSnapshot 中获取 Message 实例的列表:

       class Message {
           private String author;
           private String text;
      
           private Message() {}
      
           public Message(String author, String text) {
               this.author = author;
               this.text = text;
           }
      
           public String getAuthor() {
               return author;
           }
      
           public String getText() {
               return text;
           }
       }
      
       // Later ...
      
       GenericTypeIndicator<List<Message>> t = new GenericTypeIndicator<List<Message>>() {};
       List<Message> messages = snapshot.getValue(t);
      

      【讨论】:

      • 最好引用你从哪里得到这个答案。给予应得的功劳。
      【解决方案6】:

      查一下

      Map<String, String> map = (Map<String,String>)dataSnapshot.getValue(Map.class);
      

      通过这个

      Map map = (Map) dataSnapshot.getValue(Map.class);
      

      【讨论】:

      • 此答案复制了现有高度评价答案的内容。请确保您的回答为帖子添加更多内容。如需更多指导,请参阅How to Answer
      猜你喜欢
      • 2018-09-20
      • 2019-01-09
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 2011-09-03
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多