【问题标题】:Question about Java code convert to Kotlin related to Firebase关于 Java 代码转换为与 Firebase 相关的 Kotlin 的问题
【发布时间】:2019-03-28 00:40:07
【问题描述】:

我正在编写聊天室应用程序,现在我想将可运行的 Android Java 代码转换为 Kotlin 代码。我尝试通过添加“?”将parser 分配为空安全。但是,我无法编译代码。

Java 版本:

mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference();
SnapshotParser<FriendlyMessage> parser = new SnapshotParser<FriendlyMessage>() {
    @Override
    public FriendlyMessage parseSnapshot(DataSnapshot dataSnapshot) {
        FriendlyMessage friendlyMessage = dataSnapshot.getValue(FriendlyMessage.class);
        if (friendlyMessage != null) {
            friendlyMessage.setId(dataSnapshot.getKey());
        }
        return friendlyMessage;
    }
};

Kotlin 版本:

mFirebaseDatabaseReference = FirebaseDatabase.getInstance().reference
val parser = object : SnapshotParser<FriendlyMessage> {
    override fun parseSnapshot(dataSnapshot: DataSnapshot): FriendlyMessage {
        val friendlyMessage = dataSnapshot.getValue(FriendlyMessage::class.java)
        friendlyMessage?.setId(dataSnapshot.key!!)
        return friendlyMessage
    }
}

这是错误信息:

Type mismatch: inferred type is FriendlyMessage? but FriendlyMessage was expected


Required: friendlyMessage
Found: friendlyMessage?

【问题讨论】:

  • 您正在返回一个可为空的FriendlyMessage(即FriendlyMessage?),但该函数被声明为返回一个不可为空的FriendlyMessage。所以你要么强制返回值非空,要么将parseSnapshot的返回值更改为FriendlyMessage?
  • @m0skit0 我尝试了第一个并收到相同的错误消息,第二个也不起作用,因为 Andriod Studio 返回此错误Return type of 'parseSnapshot' is not a subtype of the return type of the overridden member '@NonNull public abstract fun parseSnapshot(@NonNull p0: DataSnapshot): FriendlyMessage defined in com.firebase.ui.database.SnapshotParser'
  • 对不起,如果你强制它不为空,即return friendlyMessage!!,它不可能是相同的错误消息。但是,这意味着如果 NPE 为空,您将获得 NPE。
  • 我可以编译代码return friendlyMessage!!,因为parseSnapshort@nonnull

标签: android firebase firebase-realtime-database kotlin firebaseui


【解决方案1】:

解析器对象被指定为

val parser = object : SnapshotParser<FriendlyMessage>

这里FriendlyMessage 是不可为空的,并且覆盖函数parseSnapshot 也具有相同的类型FriendlyMessage。有两种方法可以修复错误。返回的对象可以像这样更改为非空

return friendlyMessage!!

请注意,使用 !!不推荐,因为它会生成额外的代码来检查 null 并在 null 的情况下抛出异常。

第二种解决方案是将类型指定为可为空的。

mFirebaseDatabaseReference = FirebaseDatabase.getInstance().reference
val parser = object : SnapshotParser<FriendlyMessage?> {
    override fun parseSnapshot(dataSnapshot: DataSnapshot): FriendlyMessage? {
        val friendlyMessage = dataSnapshot.getValue(FriendlyMessage::class.java)
        friendlyMessage?.setId(dataSnapshot.key!!)
        return friendlyMessage
    }
}

【讨论】:

  • 我已经尝试过了,但它失败了,因为我收到了相同的错误消息Type mismatch: inferred type is FriendlyMessage? but FriendlyMessage was expected
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 2020-05-11
相关资源
最近更新 更多