Android Kotlin中改造回调的自定义实现

Android Kotlin中改造回调的自定义实现,android,kotlin,retrofit,retrofit2,Android,Kotlin,Retrofit,Retrofit2,我最近开始使用Kotlin进行android开发,遇到了一些小问题,通过使用文档,我能够解决这些问题,但是通过改进回调实现,我面临着一个问题。我在Java中使用的改装回调有一个自定义实现: public abstract class RemoteCallback<T> implements Callback<T> { @Override public final void onResponse(Call<T> call, Response<T> r

我最近开始使用Kotlin进行android开发,遇到了一些小问题,通过使用文档,我能够解决这些问题,但是通过改进回调实现,我面临着一个问题。我在Java中使用的改装回调有一个自定义实现:

public abstract class RemoteCallback<T> implements Callback<T> {
@Override
public final void onResponse(Call<T> call, Response<T> response) {

    switch (response.code()) {
        case HttpsURLConnection.HTTP_OK:
        case HttpsURLConnection.HTTP_CREATED:
        case HttpsURLConnection.HTTP_ACCEPTED:
        case HttpsURLConnection.HTTP_NOT_AUTHORITATIVE:
            if (response.body() != null) {
                onSuccess(response.body());
            }
            break;
        case HttpURLConnection.HTTP_UNAUTHORIZED:
            onUnauthorized();
            break;
        default:
            onFailed(new Throwable("Default " + response.code() + " " + response.message()));
    }
}

@Override
public final void onFailure(Call<T> call, Throwable t) {
    onFailed(t);
}

public abstract void onSuccess(T responseBody);

public abstract void onUnauthorized();

public abstract void onFailed(Throwable throwable);}
公共抽象类RemoteCallback实现回调{
@凌驾
公共最终void onResponse(调用、响应){
开关(response.code()){
案例HttpsURLConnection.HTTP\u正常:
案例HttpsURLConnection.HTTP\u已创建:
案例HttpsURLConnection.HTTP\u已接受:
案例HttpsURLConnection.HTTP\u非权威:
if(response.body()!=null){
onSuccess(response.body());
}
打破
案例HttpURLConnection.HTTP_未经授权:
未授权();
打破
违约:
onFailed(新的Throwable(“默认值”+response.code()+“”+response.message());
}
}
@凌驾
公共最终失效失效(调用调用,可丢弃t){
onFailed(t);
}
公开摘要不成功(T-responseBody);
未授权的公共摘要无效();
公共摘要void onFailed(Throwable Throwable);}
我在Kotlin项目中使用了相同的类,该类将java代码转换为Kotlin代码

abstract class RemoteCallback<T> : Callback<T> {
override fun onResponse(call: Call<T>, response: Response<T>) {

    when (response.code()) {
        HttpsURLConnection.HTTP_OK,
        HttpsURLConnection.HTTP_CREATED,
        HttpsURLConnection.HTTP_ACCEPTED,
        HttpsURLConnection.HTTP_NOT_AUTHORITATIVE ->
            if (response.body() != null)
            onSuccess(response.body())
        HttpURLConnection.HTTP_UNAUTHORIZED -> onUnauthorized()
        else -> onFailed(Throwable("Default " + response.code() + " " + response.message()))
    }
}

override fun onFailure(call: Call<T>, t: Throwable) {
    onFailed(t)
}

abstract fun onSuccess(responseBody: T)

abstract fun onUnauthorized()

abstract fun onFailed(throwable: Throwable)}
抽象类RemoteCallback:Callback{
覆盖fun onResponse(调用:调用,响应:响应){
当(response.code()){
HttpsURLConnection.HTTP\u正常,
HttpsURLConnection.HTTP_已创建,
HttpsURLConnection.HTTP_已接受,
HttpsURLConnection.HTTP\u非\u权威->
if(response.body()!=null)
onSuccess(response.body())
HttpURLConnection.HTTP_UNAUTHORIZED->onUnauthorized()
else->onFailed(可丢弃(“默认值”+response.code()+“”+response.message()))
}
}
覆盖失效时的乐趣(调用:调用,t:可丢弃){
onFailed(t)
}
成功的抽象乐趣(响应体:T)
自动授权的摘要()
抽象乐趣失败(throwable:throwable)}
问题是当我调用onsuces(response.body())时,它说“智能转换到'T'是不可能的,因为'response.body()'是一个复杂的表达式”
请指导我如何修复它

我的项目中有一个非常类似的实现。尝试如下

abstract class RemoteCallback: Callback<ResponseBody> {
    override fun onFailure(call: Call<ResponseBody>?, t: Throwable?) {
        onFailed(t)
    }

    override fun onResponse(call: Call<ResponseBody>?, response: Response<ResponseBody>?) {
        when (response.code()) {
            HttpsURLConnection.HTTP_OK,
            HttpsURLConnection.HTTP_CREATED,
            HttpsURLConnection.HTTP_ACCEPTED,
            HttpsURLConnection.HTTP_NOT_AUTHORITATIVE ->
                if (response.body() != null)
                onSuccess(response.body())
            HttpURLConnection.HTTP_UNAUTHORIZED -> onUnauthorized()
            else -> onFailed(Throwable("Default " + response.code() + " " + response.message()))
        }
    }

    abstract fun onUnauthorized()

    abstract fun onFailed(throwable: Throwable)
}
抽象类RemoteCallback:Callback{
覆盖失效时的乐趣(调用:调用?、t:可丢弃?){
onFailed(t)
}
覆盖fun onResponse(调用:调用?,响应:响应?){
当(response.code()){
HttpsURLConnection.HTTP\u正常,
HttpsURLConnection.HTTP_已创建,
HttpsURLConnection.HTTP_已接受,
HttpsURLConnection.HTTP\u非\u权威->
if(response.body()!=null)
onSuccess(response.body())
HttpURLConnection.HTTP_UNAUTHORIZED->onUnauthorized()
else->onFailed(可丢弃(“默认值”+response.code()+“”+response.message()))
}
}
自动授权的摘要()
抽象乐趣失败(可丢弃:可丢弃)
}

对我来说工作很好

我在我的项目上有一个非常类似的实现。尝试如下

abstract class RemoteCallback: Callback<ResponseBody> {
    override fun onFailure(call: Call<ResponseBody>?, t: Throwable?) {
        onFailed(t)
    }

    override fun onResponse(call: Call<ResponseBody>?, response: Response<ResponseBody>?) {
        when (response.code()) {
            HttpsURLConnection.HTTP_OK,
            HttpsURLConnection.HTTP_CREATED,
            HttpsURLConnection.HTTP_ACCEPTED,
            HttpsURLConnection.HTTP_NOT_AUTHORITATIVE ->
                if (response.body() != null)
                onSuccess(response.body())
            HttpURLConnection.HTTP_UNAUTHORIZED -> onUnauthorized()
            else -> onFailed(Throwable("Default " + response.code() + " " + response.message()))
        }
    }

    abstract fun onUnauthorized()

    abstract fun onFailed(throwable: Throwable)
}
抽象类RemoteCallback:Callback{
覆盖失效时的乐趣(调用:调用?、t:可丢弃?){
onFailed(t)
}
覆盖fun onResponse(调用:调用?,响应:响应?){
当(response.code()){
HttpsURLConnection.HTTP\u正常,
HttpsURLConnection.HTTP_已创建,
HttpsURLConnection.HTTP_已接受,
HttpsURLConnection.HTTP\u非\u权威->
if(response.body()!=null)
onSuccess(response.body())
HttpURLConnection.HTTP_UNAUTHORIZED->onUnauthorized()
else->onFailed(可丢弃(“默认值”+response.code()+“”+response.message()))
}
}
自动授权的摘要()
抽象乐趣失败(可丢弃:可丢弃)
}

对我来说工作正常

您正在向
非空
函数发送一个
可空
值作为参数。因此,你得到了这个问题。你可以这样做:

interface RemoteCallback<T> : Callback<T> {
    override fun onResponse(call: Call<T>?, response: Response<T>?) {
        when (response?.code()) {
            HttpsURLConnection.HTTP_OK,    
            HttpsURLConnection.HTTP_CREATED,
            HttpsURLConnection.HTTP_ACCEPTED,
            HttpsURLConnection.HTTP_NOT_AUTHORITATIVE ->
                response.body()?.apply { onSuccess(this) }
            HttpURLConnection.HTTP_UNAUTHORIZED -> onUnauthorized()
            else -> onFailed(Throwable("Default " + response?.code() + " " + response?.message()))
        }
    }

    override fun onFailure(call: Call<T>?, t: Throwable?) {
        // handle error mechanism
        t?.apply { onFailed(this) }    
    }
    fun onSuccess(responseBody: T)
    fun onUnauthorized()
    fun onFailed(throwable: Throwable)
}
接口远程回调:回调{
覆盖fun onResponse(调用:调用?,响应:响应?){
何时(响应?.code()){
HttpsURLConnection.HTTP\u正常,
HttpsURLConnection.HTTP_已创建,
HttpsURLConnection.HTTP_已接受,
HttpsURLConnection.HTTP\u非\u权威->
response.body()?.apply{onSuccess(this)}
HttpURLConnection.HTTP_UNAUTHORIZED->onUnauthorized()
else->on失败(可丢弃(“默认”+响应?.code()+“”+响应?.message()))
}
}
覆盖失效时的乐趣(调用:调用?、t:可丢弃?){
//处理错误机制
t?.apply{onFailed(this)}
}
成功的乐趣(回应体:T)
未经授权的乐趣()
乐趣失败(可丢弃:可丢弃)
}

或者,您可以只使用
onSuccess(responseBody:T?
,您的代码应该可以工作

您正在向
非空
函数发送一个
可空
值作为参数。因此,你得到了这个问题。你可以这样做:

interface RemoteCallback<T> : Callback<T> {
    override fun onResponse(call: Call<T>?, response: Response<T>?) {
        when (response?.code()) {
            HttpsURLConnection.HTTP_OK,    
            HttpsURLConnection.HTTP_CREATED,
            HttpsURLConnection.HTTP_ACCEPTED,
            HttpsURLConnection.HTTP_NOT_AUTHORITATIVE ->
                response.body()?.apply { onSuccess(this) }
            HttpURLConnection.HTTP_UNAUTHORIZED -> onUnauthorized()
            else -> onFailed(Throwable("Default " + response?.code() + " " + response?.message()))
        }
    }

    override fun onFailure(call: Call<T>?, t: Throwable?) {
        // handle error mechanism
        t?.apply { onFailed(this) }    
    }
    fun onSuccess(responseBody: T)
    fun onUnauthorized()
    fun onFailed(throwable: Throwable)
}
接口远程回调:回调{
覆盖fun onResponse(调用:调用?,响应:响应?){
何时(响应?.code()){
HttpsURLConnection.HTTP\u正常,
HttpsURLConnection.HTTP_已创建,
HttpsURLConnection.HTTP_已接受,
HttpsURLConnection.HTTP\u非\u权威->
response.body()?.apply{onSuccess(this)}
HttpURLConnection.HTTP_UNAUTHORIZED->onUnauthorized()
else->on失败(可丢弃(“默认”+响应?.code()+“”+响应?.message()))
}
}
覆盖失效时的乐趣(调用:调用?、t:可丢弃?){
//处理错误机制
t?应用程序