当一个函数声明了类型参数:
fun <T> typedFunction(value: T, option: Option<T>) { ... }
我应该如何在Kotlin中调用未经处理的未类型化的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做了什么:
这是IntelliJ如何转换我的代码:
val m: Map<Option<*>, *>? = ...
for ((key, value) in m!!) {
typedFunction<*>(key, value)
// ^^^ ERROR!!
}
但之后它会给出一个错误提示:"不允许在函数和属性类型参数上使用投影"。
typedFunction(...)
- s1m0nw1Option<*>
和Any
,这两者不兼容。 - hkoosha