如何在 Kotlin 中使用原始类型调用函数

3

当一个函数声明了类型参数:

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!!
}

但之后它会给出一个错误提示:"不允许在函数和属性类型参数上使用投影"。

1
你不能让编译器自动推断吗?typedFunction(...) - s1m0nw1
@s1m0nw1 不是的,它们被推断为Option<*>Any,这两者不兼容。 - hkoosha
1个回答

2

由于Kotlin没有原始类型,并且在函数调用中没有提供星投影的等效方式,因此应该为T指定具体类型。

您可以对Option<*>参数进行未检查的强制转换,使T变为Any

val m: Map<Option<*>, *>? = ...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接