Вопрос о преобразовании кода Java в Kotlin, связанный с Firebase - PullRequest
0 голосов
/ 23 октября 2018

Я пишу приложение Chatroom и теперь хочу преобразовать работающий Android-код Android в код 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?

1 Ответ

0 голосов
/ 23 октября 2018

Объект синтаксического анализа указан как

val parser = object : SnapshotParser<FriendlyMessage>

Здесь FriendlyMessage не имеет значения NULL и переопределенная функция parseSnapshot также имеет тот же тип FriendlyMessage.Есть 2 способа исправить ошибку.Возвращаемый объект может быть изменен на ненулевой, как это

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