为什么 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 { "" } }

其中 possibleIdDeferredDeferred<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,因为我真正想要返回的是最后一条语句