如何避免空检查

我有一个类库这样的:

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?.status = 1事情是我认为它不应该问我,因为在那一刻,我很确定todo是不再是零。
有没有什么解决办法,或者我可能误解了Kotlin的东西?

我相信你可以使变量不可为空来解决这个问题。 也许也是一个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)