【问题标题】:Custom Iterable<T>.sumOf function not working across different modules自定义 Iterable<T>.sumOf 函数不能跨不同模块工作
【发布时间】:2022-02-07 04:50:47
【问题描述】:

我在模块 A 中定义了这个数据类:

data class Amount(val value: Int)

并且我创建了以下扩展函数(也在模块 A 中):

inline fun <T> Iterable<T>.sumOf(selector: (T) -> Amount): Amount {
    var sum = 0
    for (element in this)
        sum += selector(element).value
    return Amount(sum)
}

示例用法如下所示:

val sum: Amount = (1..5).sumOf { Amount(it) }

当我在模块 A 中使用这个 sumOf 函数时,它工作得很好,但是当我尝试在不同的模块 B(它依赖于模块 A)中使用它时,编译器无法找到这个重载sumOf函数。

如果我将 sumOf 重命名为不同的名称(例如 sumBy 等),那么它也可以在模块 B 中使用。我注意到的另一件事是,即使我将该扩展函数放在模块 B 中,编译器也无法找到此重载。它显示的错误是:

None of the following functions can be called with the arguments supplied.
Iterable<TypeVariable(T)>.sumOf((TypeVariable(T)) → Int)   where T = TypeVariable(T) for    inline fun <T> Iterable<T>.sumOf(selector: (T) → Int): Int defined in kotlin.collections

followed by similar other overloads available for Long, ULong, etc.

这里有什么问题?

【问题讨论】:

    标签: kotlin multi-module kotlin-extension


    【解决方案1】:

    很可能你没有导入你的函数,所以它被完全忽略了。请注意,Kotlin 标准库已经有一个签名几乎相同的函数 (Iterable&lt;T&gt;.sumOf()),因此 IDE 可能甚至不建议您导入自定义函数,而只是使用“标准”函数。

    它从 A 工作可能是因为你从同一个包中调用它(只是我的猜测),所以它不需要导入。

    要解决此问题,您需要手动导入函数,但我建议根本不要使用此名称。它总是会引起混乱和问题——对于编译器和阅读代码并且不期望sumOf() 做与平常不同的事情的人来说都是如此。只需将其命名为sumOfAmounts()

    【讨论】:

    • 在这种情况下,导入不是问题。我什至尝试将函数放在同一个文件中并调用它,但还是不行。
    • 所以你说你有完全相同的文件,包含函数和对它的调用,这个文件在 A 模块中工作,但在模块 B 中没有?无论如何,我确认如果创建了这样的函数并从另一个包(相同的模块)访问它,IntelliJ 不建议导入该函数。但是手动添加导入后,它可以工作。但我无法解释您的观察结果,即使在同一个文件中也不起作用。
    • Amount 数据类在模块 A 中,我想从模块 B 调用 sumOf(这取决于 B)。我尝试将sumOf 函数一次放在模块A 中,然后放在模块B 中,在这两种情况下它都不起作用。此外,这实际上是一个 android 项目,其中不同的模块是 gradle 模块。不确定这是否与问题有关。
    • 你把 sumOf() 放在模块 B 中与试图调用这个函数的代码相关的什么地方?我问是因为如果它们在两个单独的包中,那么我描述的问题仍然有效。但是,如果您将函数定义和对它的调用放在同一个文件中(如您之前所说),那么我看不出它可能不起作用的原因。
    • 我尝试了两种方法(将方法放在与调用者不同的模块中,并将两者放在同一个文件中)。都没有奏效。最后将其重命名为sumBy。不行,不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2012-05-02
    • 2018-04-29
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多