您如何编写子类泛型?

时间:2019-01-27 10:18:29

标签: android generics inheritance kotlin android-volley

好的,因此,我尝试使用Volley为RESTful服务器实现客户端。

我有IServerRequestIServerResponse域对象。

我现在想编写一个IServerRequestVisitor,将IServerRequest转换为Volley请求。

现在凌空抽空Request<ResponseType>将使用NetworkResponse并尝试将其解析为ResponseType。然后,它需要一组两个侦听器:

Response.Listener<ResponseType>,当请求成功解析响应时调用。

Response.ErrorListener(如果没有)。

所以我的设想是:

我有一个

class VolleyRequestDispatcher(
        private val context:Context
):IServerRequestVisitor<VolleyResponseListeners<IServerResponse>,Unit> {...}
实现IServerRequestVisitor接口的

。目前,只有一种类型的请求需要处理,但还需要添加更多类型。

interface IServerRequestVisitor<in Params, out ReturnType>{
    fun visit(req: ILoginRequest, params:Params):ReturnType
}

我现在将两个侦听器封装到一个自定义类中,以便将它们作为参数传递给我的侦听器。

data class VolleyResponseListeners<ResponseType>(
        /**Called IFF the corresponding [Request] succeeds in parsing its [Response]*/
        val onResponse:Response.Listener<ResponseType>,

        /**Called if there was an error parsing the [Response]*/
        val onError: Response.ErrorListener
)

到目前为止,太好了。让我们实际创建一个

class VolleyLoginRequest(
        serverURL:String,
        private val loginRequest:ILoginRequest,
        private val listener:Response.Listener<ILoginResponse>,
        errorListener:Response.ErrorListener
): Request<ILoginResponse>(Method.POST,"$serverURL/login",errorListener){...}

,如果我现在去VolleyRequestDispatcher并写

override fun visit(req: ILoginRequest, params:VolleyResponseListeners<IServerResponse>){
    val serverURL = WebConfig.getServerURL()
    val request = VolleyLoginRequest(serverURL,req,params.onResponse,params.onError)
    //dispatch the request
}

当我在params.onResponse中指定我想要类型为Response.Listener<IServerResponse>的侦听器时,AndroidStudio抱怨VolleyLoginRequest的类型为Response.Listener<ILoginResponse>

现在显然,ILoginResponseIServerResponse的子类型。因此,我认为我应该可以在适当的位置放置一些inout来完成这项工作。

不过,到目前为止,我仍无法弄清楚那是哪里。

如果有人可以帮助我解决这个问题,将不胜感激。

(是的,我 am 知道我可以将VolleyLoginRequest更改为要求Response.Listener<IServerResponse>,然后希望客户进行进行类型检查并投放到侦听器中,但我不希望这样做。)

0 个答案:

没有答案
相关问题