类 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<String, String> map = (Map<String, Object>) 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 具有泛型类型参数
Python 3 类型,具有任意数量的包含类型的自定义可变参数泛型,如何?
无法为 JSP 编译类:无法解析 java.util.Map$Entry 类型。它是从所需的 .class 文件中间接引用的