如何避免无效检查

问题描述:

我有一个仓储类是这样的:如何避免无效检查

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问我更换todo == null用elvis运算符:

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) 

但后来,它要求我在将状态设置为1时使用空检查h todo?.status = 1 事情是,我认为它不应该问我,因为在那一点上,我非常肯定todo不是null了。
有什么解决方法,或者我可能误解了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) 
+0

但如果没有找到 –

+0

它,如果它返回null'findByUid'返回null,则该方法将立即被猫王操作返回。 – Naetmul

+1

如果你在后面使用':',这应该不成问题。事实上,你可以尝试完全省略显式类型,我想你会得出'Todo'推断。 – zsmb13