首页 文章

通用参数任何kotlin转换为通配符(?)

提问于
浏览
3

当我使用kotlin和retrofit2时遇到了一个问题,kotlin的泛型参数转换为通配符(?),但不是在java中 .

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

但改装对待它们的方式不同 .

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

将kotlin中的 Map<String, Any> 编译成 [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);
        }
        ……
    }
    ……
}

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

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

    }
    ……
}

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);

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>

1 回答

  • 1

    您只需将 @JvmSuppressWildcards 添加到您的接口名称即可 .

    @JvmSuppressWildcards
    internal interface WebService {
        ...
    }
    

相关问题