kotlin的通用参数Any转换为通配符(?)

lik*_*ike 8 any kotlin retrofit2

使用kotlin和retrofit2时遇到问题,kotlin的通用参数被转换为通配符(?),但在Java中却没有。

现在,我需要Map<String, Object>在Java中使用一个参数(键是String类型,值不固定),将其转换为kotlin代码是Map<String, Any>

但是改造对它们的处理方式有所不同。

Map<String, Object>在Java中被编译成[java.util.Map<java.lang.String, java.lang.Object>],并且可以正常工作。

Map<String, Any>在kotlin中将其编译为[java.util.Map<java.lang.String, ?>],则retrofit2 抛出parameterError(参数类型不得包含类型变量或通配符)。

1?改装相关代码

public ServiceMethod build() {
    ……
    for (int p = 0; p < parameterCount; p++) {
        Type parameterType = parameterTypes[p];
        if (Utils.hasUnresolvableType(parameterType)) {
            throw parameterError(p, "Parameter type must not include a type variable or wildcard: %s", parameterType);
        }
        ……
    }
    ……
}
Run Code Online (Sandbox Code Playgroud)

Utils.hasUnresolvableType(parameterType)方法的引用如下

final class Utils {
    ……
    static boolean hasUnresolvableType(Type type) {
        ……
        if (type instanceof WildcardType) {
            return true;
        }
        ……

    }
    ……
}
Run Code Online (Sandbox Code Playgroud)

2,在Java接口中,我需要一个参数Map<String, Object>(键是String类型,值不固定),可以将其编译为[java.util.Map<java.lang.String, java.lang.Object>],并且可以正常工作。

@GET("/index.html")
Observable<ResponseBody> getQueryMap(@QueryMap Map<String, Object> params);
Run Code Online (Sandbox Code Playgroud)

3?kotlin的接口,我需要一个参数Map<String, Any>(键是String类型,值不固定),但是会被编译成[java.util.Map<java.lang.String, ?>],而Retrofit2会抛出parameterError(参数类型不能包含类型变量或通配符)。

@GET("/index.html")
fun getQueryMap(@QueryMap paramsMap: Map<String, Any>): Observable<ResponseBody>
Run Code Online (Sandbox Code Playgroud)

Abd*_*ood 12

您只需要添加@JvmSuppressWildcards接口名称即可。

@JvmSuppressWildcards
internal interface WebService {
    ...
}
Run Code Online (Sandbox Code Playgroud)