有关将Java代码转换为与Firebase相关的Kotlin的问题

时间:2018-10-23 17:29:44

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

我正在编写Chatroom App,现在我想将可运行的Android Java代码转换为Kotlin代码。我尝试通过添加“?”将parser分配为Null Safety。但是,我无法编译代码。

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;
    }
};

科特林版本:

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?

1 个答案:

答案 0 :(得分:0)

解析器对象指定为

val parser = object : SnapshotParser<FriendlyMessage>

此处FriendlyMessage不可为空,并且重写函数parseSnapshot也具有相同的类型FriendlyMessage。有2种方法可以修复该错误。这样返回的对象可以更改为非null

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
    }
}