我正在编写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?
答案 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
}
}