gpt4 book ai didi

kotlin - 任何 kotlin 的泛型参数都转换为通配符(?)

转载 作者:IT老高 更新时间:2023-10-28 13:40:06 26 4
gpt4 key购买 nike

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

现在,我需要一个参数Map<String, Object> (key为String类型,值不固定)在java中,转换为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);
}
……
}
……
}

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

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

}
……
}

2、java中的接口(interface),我需要一个参数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中的接口(interface),我需要一个参数Map<String, Any> (键为String类型,值不固定),但编译成[java.util.Map<java.lang.String, ?>] ,并且retrofit2会抛出parameterError(参数类型不能包含类型变量或通配符)。

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

最佳答案

您只需将 @JvmSuppressWildcards 添加到您的接口(interface)名称。

@JvmSuppressWildcards
internal interface WebService {
...
}

关于kotlin - 任何 kotlin 的泛型参数都转换为通配符(?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45409461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com