【问题标题】:Android Studio Kotlin error with dataSnapshot.getValue带有 dataSnapshot.getValue 的 Android Studio Kotlin 错误
【发布时间】:2018-07-20 04:20:33
【问题描述】:

我在最近的一个项目中将一个 java 文件转换为 kotlin 文件,问题是我遇到了这个代码的错误:

 val map = dataSnapshot.getValue<Map<*, *>>(Map<*, *>::class.java)

我在“Map::class”下有一条红线,android studio 说:

类文字的左侧只允许使用类

我应该如何处理这段代码?有没有其他的写法?

这里是一个相对的kotlin代码sn-p:

val messageText = messageArea!!.text.toString()
        if (messageText != "") {
            val map = HashMap<String, String>()
            map.put("message", messageText)
            map.put("user", UserDetails.username)
            reference1!!.push().setValue(map)
            reference2!!.push().setValue(map)
            messageArea!!.setText("")
        }
    }
    reference1!!.addChildEventListener(object : ChildEventListener {
        override fun onChildAdded(dataSnapshot: DataSnapshot, s: String) {
            val map = dataSnapshot.getValue<Map<*, *>>(Map<*, *>::class.java)
            val message = map.get("message").toString()
            val userName = map.get("user").toString()

原始java代码sn-p:

String messageText = messageArea.getText().toString();

            if(!messageText.equals("")){
                Map<String, String> map = new HashMap<String, String>();
                map.put("message", messageText);
                map.put("user", UserDetails.username);
                reference1.push().setValue(map);
                reference2.push().setValue(map);
                messageArea.setText("");
            }
        }
    });

    reference1.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Map map = dataSnapshot.getValue(Map.class);
            String message = map.get("message").toString();
            String userName = map.get("user").toString();

【问题讨论】:

  • 你能把原始的java代码贴出来吗?
  • 我已经用java代码编辑了帖子。
  • 也许你可以在这个question找到你的答案
  • 非常感谢各位,问题已解决。

标签: java android firebase kotlin


【解决方案1】:

根据对 question 的回答,您可以选择使用 Kotlin 的 reified 功能并实现类似的东西来扩展 DataSnapshot。

inline fun <reified T> DataSnapshot.getValue(): T? {
    return getValue(T::java.class)
}

或者基于 Firebase 的 documentation 的 DataSnapshot 你可以得到这样的地图值。

val map = dataSnapshot.getValue()
if (map is Map<*, *>) {
    val message = map["message"].toString()
    val userName = map["user"].toString()
}

【讨论】:

    【解决方案2】:

    尝试投射它。

    val map = dataSnapshot.getValue(Map::class.java) as Map<String, String>
    

    您可能希望禁止显示“Unchecked Cast”的警告,但这没关系。

    【讨论】:

      猜你喜欢
      • 2018-02-21
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多