如何使用原始类型

时间:2018-01-11 12:32:05

标签: generics kotlin

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

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的作用:

这就是IntelliJ转换代码的方式:

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

但之后出现错误:“函数和属性的类型参数不允许进行预测”

1 个答案:

答案 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
}