类 java.util.Map 具有泛型类型参数,请改用 GenericTypeIndicator

Posted

技术标签:

【中文标题】类 java.util.Map 具有泛型类型参数,请改用 GenericTypeIndicator【英文标题】:Class java.util.Map has generic type parameters, please use GenericTypeIndicator instead 【发布时间】: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 值没有问题。 使用了解决方案但不起作用

【问题讨论】:

【参考方案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。

以上是关于类 java.util.Map 具有泛型类型参数,请改用 GenericTypeIndicator的主要内容,如果未能解决你的问题,请参考以下文章

类 java.util.ArrayList 具有泛型类型参数,请改用 GenericTypeIndicator

Firebase:类 java.util.List 具有泛型类型参数

Scala的泛型

Python 3 类型,具有任意数量的包含类型的自定义可变参数泛型,如何?

无法为 JSP 编译类:无法解析 java.util.Map$Entry 类型。它是从所需的 .class 文件中间接引用的

实验10穷吉201771010119