为什么 Kotlin return Deferred<{Comparable & java.io.Serializable}> 而不是 Deferred<String>?
Why Kotlin return Deferred<{Comparable & java.io.Serializable}> instead of Deferred<String>?
根据intellij和gradle,这个变量a
类型是Deferred<{Comparable & java.io.Serializable}>
:
val a = async(IO) { possibleIdDeferred.await()?.also { repo.findAttrById(it) } ?: run { "" } }
其中 possibleIdDeferred
是 Deferred<Long?>
,这是 repo 函数:
@Cacheable("someCacheName")
suspend fun findAttrById(id: Long) = entityRepo.findById(id)!!.someAttr
其中 entityRepo
声明是
@Repository
interface EntityRepo : CoroutineCrudRepository<Entity, Long> {
suspend fun findByAttr(attr: String): Entity?
}
如果我在此处添加 as String
:
val a = async(IO) { possibleIdDeferred.await()?.also { repo.findAttrById(it) as String} ?: run { "" as String} }
我得到 [USELESS_CAST] No cast needed
。如果我尝试 a.await() as String
,我会得到 [CAST_NEVER_SUCCEEDS] This cast can never succeed
。我应该更改什么以使变量 a
类型为字符串?
因为 also
returns 它自己的上下文,我有
val a = someNullableInt ?: emptyString
导致问题标题出现这种奇怪的类型。我修复了它,将 also
更改为 let
,因为我真正想要返回的是最后一条语句
根据intellij和gradle,这个变量a
类型是Deferred<{Comparable & java.io.Serializable}>
:
val a = async(IO) { possibleIdDeferred.await()?.also { repo.findAttrById(it) } ?: run { "" } }
其中 possibleIdDeferred
是 Deferred<Long?>
,这是 repo 函数:
@Cacheable("someCacheName")
suspend fun findAttrById(id: Long) = entityRepo.findById(id)!!.someAttr
其中 entityRepo
声明是
@Repository
interface EntityRepo : CoroutineCrudRepository<Entity, Long> {
suspend fun findByAttr(attr: String): Entity?
}
如果我在此处添加 as String
:
val a = async(IO) { possibleIdDeferred.await()?.also { repo.findAttrById(it) as String} ?: run { "" as String} }
我得到 [USELESS_CAST] No cast needed
。如果我尝试 a.await() as String
,我会得到 [CAST_NEVER_SUCCEEDS] This cast can never succeed
。我应该更改什么以使变量 a
类型为字符串?
因为 also
returns 它自己的上下文,我有
val a = someNullableInt ?: emptyString
导致问题标题出现这种奇怪的类型。我修复了它,将 also
更改为 let
,因为我真正想要返回的是最后一条语句