【发布时间】: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