gpt4 book ai didi

generics - 如何使用原始类型调用 kotlin 中的函数

转载 作者:行者123 更新时间:2023-12-02 12:22:57 26 4
gpt4 key购买 nike

当函数声明类型参数时:

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 的类型并将它的两个参数都绑定(bind)到这个声明的类型,并且在调用站点上我循环遍历多个值,这些值的确切类型是未知(但已知是安全的,两个参数都符合相同的类型)我无法按预期方式调用 typedFunction。我必须将其转换为原始类型。

如何在 kotlin 中实现相同的功能?

IntelliJ 的作用:

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

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

但之后会报错:“Projections is not allowed on type arguments of functions and properties”

最佳答案

由于 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
}

关于generics - 如何使用原始类型调用 kotlin 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48207170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com