我有一个像这样的存储库类:
interface TodosRepository : CrudRepository<Todo, Long> {
fun findByUid(uid: String): Todo?
}
以及可以将此待办事项标记为已完成的方法:
fun markAsDone(uid: String): ResponseEntity<String> {
var todo = todosRepository.findByUid(uid)
if(todo == null){
return ResponseEntity("Not found", HttpStatus.NOT_FOUND)
}
todo.status = 1
todosRepository.save(todo)
return ResponseEntity.ok("Saved")
}
IntelliJ让我用elvis操作符替换todo == null
:
fun markAsDone(uid: String): ResponseEntity<String> {
var todo: Todo? = todosRepository.findByUid(uid) ?: return ResponseEntity("Not found", HttpStatus.NOT_FOUND)
todo.status = 1
todosRepository.save(todo)
然后,它要求我在使用todo?.status = 1
将状态设置为1时使用空检查
问题是我认为它不应该问我,因为在那一点上,我很确定todo
不再是空的。
是否有任何解决方法,或者我可能在Kotlin上误解了什么?
答案 0 :(得分:4)
我相信你可以让变量不可为空来解决这个问题。可能还是val
。
val todo: Todo = todosRepository.findByUid(uid) ?: return ResponseEntity("Not found", HttpStatus.NOT_FOUND)
编辑:省略返回类型也应该可以推断出非可空Todo
类型。
如果您没有明确的类型,IntelliJ建议的自动更改将会顺利进行;似乎它选择保持它不被修改而不是将其更改为不可为空,这有点违背了暗示的目的。
val todo = todosRepository.findByUid(uid) ?: return ResponseEntity("Not found", HttpStatus.NOT_FOUND)