返回泛型类型的成员变量时出错(在Android上,不确定是否有任何区别)
private var mData: T? = null
override fun <T> getJsonPOJO(): T? {
return mData
}
Type mismatch: inferred type is T#2 (type parameter of RemoteData)? but T#1 (type parameter of RemoteData.getJsonPOJO)? was expected
这是代码,函数返回泛型类型:
interface IRemoteData {
fun isSuccess() : Boolean
fun <T> getJsonPOJO() : T?
fun getCode() : Int
fun getMessage() : String
}
class RemoteData<T>(response: Response<ResponseBody>, pojoClassType: Class<T>) : IRemoteData {
private val mIsSuccess: Boolean = response.isSuccessful
private val mCode: Int = response.code()
private val mMessage : String = response.message() ?: ""
private var mData: T? = null
init {
val jsonString: String? = response.body()?.string() ?: ""
mData = if (jsonString != null) Gson().fromJson(jsonString, pojoClassType) else null
}
override fun isSuccess(): Boolean {
return mIsSuccess
}
override fun <T> getJsonPOJO(): T? {
return mData //<=== compile error here
}
override fun getCode(): Int {
return mCode
}
override fun getMessage(): String {
return mMessage
}
}
任何建议都非常感谢!
尝试只返回传入的T,它仍然得到相同的错误:
class RemoteData<T>(response: Response<ResponseBody>, pojoClassType: Class<T>, testData: T) : IRemoteData {
......
private var mData: T? = testData
......
override fun <T> getJsonPOJO(): T? {
return mData //<=== same compiler error
}
}
答案 0 :(得分:4)
以下是您正在寻找的内容:
interface IRemoteData<T> {
fun isSuccess() : Boolean
fun getJsonPOJO() : T?
fun getCode() : Int
fun getMessage() : String
}
class RemoteData<T>(response: Response<ResponseBody>, pojoClassType: Class<T>) : IRemoteData<T> {
private var mData: T? = null
override fun getJsonPOJO(): T? {
return mData
}
}
T
将在任何地方被替换,所以想象一下它是String
(我觉得在玩泛型类型时更简单)。
你有:
interface IRemoteData<String> {
fun getJsonPOJO(): String?
}
class RemoteData<String>(...): IRemoteData<String> {
private var mData: String? = null
override fun getJsonPOJO(): String? {
return mData
}
}
那就是它!
答案 1 :(得分:2)
您正在寻找创建一个具有一个类型参数的类,该类扩展了具有一个类型参数的接口。首先,将泛型类型添加到您的界面签名。
interface IRemoteData<T>
将具体类的类型参数视为不同的字母可能会有所帮助。
class RemoteData<E>
请注意,如果所有RemoteData实例都使用Int
而不是泛型类型,则会删除<E>
类型,只需使用Int
作为类型参数扩展IRemoteData。
class RemoteData : IRemoteData<Int>
但是,您要找的是将提供给RemoteData的泛型类型直接传递给IRemoteData。
class RemoteData<E> : IRemoteData<E>
因此,当您将RemoteData实例化为RemoteData<Int>
时,IRemoteData::getJsonPojo()
的返回类型将为Int
。
所有在一起:
interface IRemoteData<T> {
fun getJsonPojo(): T
}
class RemoteData<E> : IRemoteData<E> {
override fun getJsonPojo(): E {
// return something type E
}
}
// elsewhere
val data = RemoteData<Int>()
val x: Int = data.getJsonPojo()