kotlin,如何返回泛型类型的成员变量

时间:2018-04-20 21:07:33

标签: generics kotlin

返回泛型类型的成员变量时出错(在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
    }
}

2 个答案:

答案 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()