为什么我需要将构造函数参数指定为可为null的泛型类型



我正在尝试使OK((调用ApiResponse构造函数。当我给ApiResponse构造函数参数null时,它显示类型不匹配的错误。

如果我将数据类型更改为T?它是有效的。为什么会这样?T的默认上限是Any?所以我认为分配null不会有任何问题。

class ApiResponse<T> private constructor(
val data: T, // If I change data type to T?, no error
val message: String?
) {
companion object {
fun <T> OK(): ApiResponse<T> {
return ApiResponse(null, null)
}
fun <T> OK(data: T): ApiResponse<T> {
return ApiResponse(data, null)
}
}
}

我搜索了关键词kotlin,generic,constructor,nullable,T,但我找不到答案。

在中

fun <T> OK(): ApiResponse<T> {
return ApiResponse(null, null)
}

如果有人调用ApiResponse.OK<String>(),则它尝试构造ApiResponse,其中data为null,并且类型为String,这是不兼容的。您的任何类型都不能阻止该调用——当您对函数有这样的泛型类型参数时,调用方可以指定他们想要的任何T,包括非null类型。

必须返回ApiResponse<T?>,或者不具有无参数的OK工厂方法。

最新更新