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)
| 归档时间: |
|
| 查看次数: |
2997 次 |
| 最近记录: |