如何用原始types在kotlin中调用函数

当一个函数声明一个types参数时:

fun  typedFunction(value: T, option: Option) { ... } 

我应该如何在kotlin中调用raw un-typed typedFunction?

为什么?

在Java中我有:

 // This is a method in an external library. I can not change it. void  typedFunction(T t, Option o) { ... } // This is my code. optionsValues contains many types // such as Option, Option, 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声明了一个名为Ttypes,并将它的两个参数绑定到这个声明的types,并且在呼叫站点上,我循环了多个确切types未知的值(但是已知是安全的,两个参数符合相同的types)不按照预期的方式调用typedFunction。 我必须把它变成一个原始types。

在kotlin中如何实现相同?

IntelliJ做了什么:

这就是IntelliJ如何转换我的代码:

 val m: Map<Option, *>? = ... for ((key, value) in m!!) { typedFunction(key, value) // ^^^ ERROR!! } 

但之后会出错:“函数和属性的types参数不允许投影”

由于Kotlin没有原始types,也没有为函数调用提供等价的星形投影,所以T应该有一个具体的types。

您可以对Option进行一个未选中的Option<*>参数转换,以使T变成Any

 val m: Map, *>? = ... for ((key, value) in m!!) { @Suppress("unchecked") typedFunction(key as Option, value) // inferred T := Any }