我正在尝试使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
工厂方法。