java调用kotlin的扩展方法、扩展属性、扩展函数

kotlin的扩展方法,其实是以java的静态方法形式存在的,也就是说如果要用java调用kotlin的扩展方法,和调用静态函数一样

调用扩展属性也是相同的道理

举个例子,我们在某个kotlin文件(文件名为Utils.kt)里为Throwable写一个根据错误类型返回错误消息的扩展方法:

fun Throwable.getShowMsg1() = when(this){
        is HttpException ->"${
        when(code()){
            401 -> "文件未授权或证书错误"
            403 -> "服务器拒绝请求"
            404 -> "服务器找不到请求的文件"
            408 -> "请求超时,服务器未响应"
            500 -> "服务器内部错误)服务器遇到错误,无法完成请求。"
            502 -> "服务器从上游服务器收到无效响应。"
            503 -> "服务器目前无法使用"
            504 -> "服务器从上游服务器获取数据超时"
            else -> "服务器错误"
        }
        },错误码:${code()}"
        is ParseException -> "json格式错误"
        is JSONException -> "json解析错误"
        is JsonParseException -> "json参数错误"
        is SSLHandshakeException -> "证书验证失败"
        is SocketTimeoutException -> "连接超时"
        is UnknownHostException -> "网络链接失败"
        is ErrnoException -> "网络不可访问"
        is OnErrorNotImplementedException -> cause?.showMsg?:message?:"未知错误"
        else -> message?:"未知错误"
    }

在kotlin里可以直接调用:

fun printError(t:Throwable){
    println(t.getShowMsg1())
}

在java里,会被编译成静态方法,调用时以静态方法的方式调用:

    public void printError(Throwable t){
        //java调用kotlin扩展方法:
        //文件名.扩展名(扩展类),例如:UtilsKt.getShowMsg1(t)
        //注意,扩展方法写在Utils.kt文件里,因此类名应该是:UtilsKt
        //以下写法与上面kotlin的写法等价
        System.out.println(UtilsKt.getShowMsg1(t));
    }

扩展属性的调用与扩展方法类似,依然以返回错误类型的错误消息为例:

为Throwable写一个showMsg的扩展属性:

val Throwable.showMsg:String get() = when(this){
    is HttpException ->"${
    when(code()){
        401 -> "文件未授权或证书错误"
        403 -> "服务器拒绝请求"
        404 -> "服务器找不到请求的文件"
        408 -> "请求超时,服务器未响应"
        500 -> "服务器内部错误)服务器遇到错误,无法完成请求。"
        502 -> "服务器从上游服务器收到无效响应。"
        503 -> "服务器目前无法使用"
        504 -> "服务器从上游服务器获取数据超时"
        else -> "服务器错误"
    }
    },错误码:${code()}"
    is ParseException -> "数据格式错误,请稍后重试"//后台返回的json格式有误,导致解析失败
    is JSONException -> "发送的数据不正确,请稍后重试"//前端发送给后台的json格式有误
    is JsonParseException -> "json参数异常导致解析失败" //后台返回的json格式有误,Gson解析失败
    is SSLHandshakeException -> "证书验证失败"
    is SocketTimeoutException -> "连接超时,请稍后重试"
    is TimeoutException -> "连接超时,服务器未在设定时间内回应,请稍后重试"
    is UnknownHostException -> "网络链接失败"
    is ErrnoException -> "网络不可访问"
    is OnErrorNotImplementedException -> cause?.showMsg?:message?:"未知错误"
    else -> message?:"未知错误"
}

在kotlin里调用该扩展属性:

fun printError(t:Throwable){
    println(t.showMsg)
}

在java里调用

    public void printError(Throwable t){
        //kotlin的扩展属性,编译时同样会改成静态方法,
        // 调用方式与调用扩展方法类似
        System.out.println(UtilsKt.getShowMsg(t));
    }

猜你喜欢

转载自blog.csdn.net/jingzz1/article/details/106093939