android - 当返回通用类型 * 我得到错误信息不足以推断类型变量 T
问题描述
我有以下代码 -
// My function -
suspend fun leaveGroup(isSoloGroup: Boolean, groupMemberEntity: GroupMemberEntity): Resource<*> {
val snapShot = remoteDataSource.getSnapshot(GROUP_MEMBERS_COLLECTION) {
whereEqualTo(Constants.DatabaseProperties.ID, groupMemberEntity.id)
}
if (snapShot is Resource.Exception) {
return snapShot
}
val delete = remoteDataSource.deleteSnapshot(snapShot.data!!)
if (delete is Resource.Exception) {
return delete
}
if (isSoloGroup.not()) {
return (Resource.Success()) // This is where the error occurs
}
// Code continues ...
}
//My resource class -
sealed class Resource<T> {
abstract val data: T?
data class Success<T>(override val data: T? = null) : Resource<T>()
data class Exception<T>(val throwable: Throwable, override val data: T? = null) : Resource<T>()
data class Loading<T>(val hasStarted: Boolean = false, override val data: T? = null) : Resource<T>()
}
并且由于某种原因,当我返回类型时Resource<*>
,Resource. Success
无法使用其默认值实例化该类null
,我必须明确地给它一个空值 - 否则我会收到错误消息 Not enough information to infer type variable T
。在构造函数中给它 null 显然是可行的,但这不是干净的代码,并且使默认值变得多余。我错过了什么?
解决方案
类型系统中有一个Nothing
类型,它没有值,无法实例化。
因为 Nothing 没有值,Nothing?
实际上是null
Kotlin 中只捕获值的类型。
也就是说,当您声明这样的内容时:
val someVariable = null
someVariable 的推断类型是Nothing?
因此,如果您希望存储 null,则必须给它一个类型(编译器不能直接推断它,因为它可以是String?
,Int?
等),因此明确地给出它Nothing?
更合适。
if (isSoloGroup.not()) {
return Resource.Success<Nothing>()
}
推荐阅读
- angular - Angular 8:使用 *ngIf 时控制台 ExpressionChangedAfterItHasBeenCheckedError 出现错误
- php - 如何将 foreach() Mysql select 转换为 HTML 表单
- php - 将表格数据编码为特定的 json 格式
- go - 使用 go 模块后 IDE 无法跟踪我的代码
- docker - 尽管有重启策略,Docker restartmanger 仍会阻止重启
- python - 查找并遍历文件中的每个部分?
- r - tidyverse:选择每年内具有相同水平因子的行
- anaconda - 什么可能是另一个环境?人工智能学习
- python - 谷歌日历 API——“超出未经验证使用的每日限制。继续使用需要注册”
- selenium - org.openqa.selenium.InvalidElementStateException:无效元素状态:元素必须是用户可编辑的才能清除它