当函数声明一个类型参数时:
fun <T> typedFunction(value: T, option: Option<T>) { ... }
如何在kotlin中调用raw un-typed typedFunction?
在java中我有:
// This is a method in an external library. I can not change it.
void <T> typedFunction(T t, Option<T> o) { ... }
// This is my code. optionsValues contains many types
// such as Option<Integer>, Option<String>, and ...
Map<Option<?>, ?> m = readAndParseFromConfigFile();
for (Map.Entry<Option<?>, ?> e : m.entrySet()) {
// The cast does the trick!
// I know my code is safe, I can tell the compiler to back off.
typedFunction((Option) e.getKey(), e.getValue());
}
因为typedFunction
声明了一个名为T
的类型并且将它的参数绑定到这个声明的类型,并且在调用站点上我循环了多个确切类型未知的值(但已知是安全,两个参数都符合相同的类型)我不能按照预期的方式调用typedFunction。我必须把它变成原始类型。
如何在kotlin中实现相同目标?
这就是IntelliJ转换代码的方式:
val m: Map<Option<*>, *>? = ...
for ((key, value) in m!!) {
typedFunction<*>(key, value)
// ^^^ ERROR!!
}
但之后出现错误:“函数和属性的类型参数不允许进行预测”
答案 0 :(得分:2)
由于Kotlin没有原始类型,并且没有为函数调用提供星形投影等价物,因此T
应该有一个具体的类型。
您可以将Option<*>
参数的未经检查的强制转换为Option<Any>
,以便T
成为Any
:
val m: Map<Option<*>, *>? = ...
for ((key, value) in m!!) {
@Suppress("unchecked")
typedFunction(key as Option<Any>, value) // inferred T := Any
}