当我使用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>]
,并且工作正常。
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>
答案 0 :(得分:3)
您只需要在界面名称中添加@JvmSuppressWildcards
。
@JvmSuppressWildcards
internal interface WebService {
...
}