为什么 Kotlin 返回 Deferred<{Comparable & java.io.Serializable}> 而不是 Deferred<String>?



根据intellij和gradle,此变量a类型为Deferred<{Comparable & java.io.Serializable}>:

val a = async(IO) { possibleIdDeferred.await()?.also { repo.findAttrById(it) } ?: run { "" } }

其中possibleIdDeferredDeferred<Long?>,这是回购函数:

@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类型为String?

由于also返回自己的上下文,我有

val a = someNullableInt ?: emptyString

导致了这个奇怪类型的问题标题。我修复了将also更改为let的问题,因为我真正想要返回的是最后一条语句

最新更新