问题标签 [extension-function]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
68 浏览

kotlin - 通用接口的扩展函数

考虑以下接口

我想在注入特定实现的 Spring Boot 应用程序中使用它,以便扩展功能可用于该类型。

但是,这不起作用。编译器不解析扩展函数。

0 投票
0 回答
85 浏览

android - 单元测试列表扩展功能 - Kotlin

我是单元测试的新手,并且面临扩展功能的问题,这是一种:

现在如果我想测试这个函数,我如何在测试时向函数提供列表。

在这种情况下,水只是一个例子。

0 投票
1 回答
79 浏览

kotlin - kotlin 中的 vararg 和扩展函数

我正在尝试在 kotlin 中编写扩展函数。我几乎走到了尽头,但一件简单的事情阻止了我。代码如下:

null 带有下划线,它说:“Null 不能是非 null 类型 Array<out () -> Unit> 的值”

有没有办法解决这个问题,或者在这种情况下我根本无法使用 vararg?谢谢

0 投票
1 回答
35 浏览

kotlin - 创建 kotlin 中缀表示法以将函数嵌套到另一个时类型不匹配

我正在尝试创建一个中缀符号作为函数的扩展函数,(Int) -> Int用于将函数嵌套到另一个函数。
例如:

这段代码工作正常,它创建了一个中缀符号nest作为函数的扩展(Int) -> Int函数。它需要另一个(Int) -> Int函数并将它们嵌套在一起。
val func = ::f nest ::g等于val fun func(x:Int) = f(g(x))
func(10)等于(10 + 2) * 2

但是当我尝试将此扩展notate函数扩展为Number接口时遇到了一个问题(用于支持各种数字)。
例如:

kotlin 编译器会抛出错误。

我想知道为什么Int从 延伸Number,但(Int) -> Int不匹配到(Number) -> Number
如果我想将此符号函数扩展到所有请求数字并返回数字的函数(例如(Long) -> Long (Float) -> Double等),我该怎么办?

0 投票
2 回答
229 浏览

kotlin - 在 Kotlin 中仅向具有多个类型参数的扩展函数提供一个类型参数

介绍

在 Kotlin 中,我有一个通用的转换扩展函数,它简化了将类型对象转换为this另一种类型C的对象(T声明为receiveractionreceiverthis

它是这样使用的:

我注意到我经常使用这个由无参数构造函数创建的函数,并认为通过创建基于其类型自动构建的receivers附加版本来进一步简化它会很好,如下所示:convertTo()receiver

不幸的是,我不能这样称呼它:

因为 Kotlin 需要提供三个类型参数。

问题

鉴于上述上下文,是否可以在 Kotlin 中创建一个具有多个类型参数的泛型函数,该函数只接受提供一个类型参数,而其他类型由调用站点确定?

其他示例(@broot 提供)

想象一下 stdlib 中没有filterIsInstance(),我们想实现它(或者我们是 stdlib 的开发者)。假设我们可以访问,@Exact因为这对我们的示例很重要。最好将其声明为:

现在,像这样使用它会最方便:

不幸的是,我们必须使用一种解决方法:

最后一个没那么糟糕。

现在,我们想创建一个函数来查找特定类型的项目并映射它们:

同样,像这样使用它会很好:

相反,我们有这个:

这仍然没有那么糟糕,但是该示例故意相对简单以使其易于理解。实际上,该函数会更复杂,会有更多类型的参数,lambda 会接收更多参数等等,然后它就会变得难以使用。在收到关于类型推断的错误后,用户必须彻底阅读函数的定义以了解缺少什么以及在哪里提供显式类型。

cat is Dog附带说明:Kotlin 不允许这样的代码: ,但允许这样的代码:这不是很奇怪cats.filterIsInstance<Dog>()吗?我们自己filterTyped()不允许这样做。所以也许(但只是也许),filterIsInstance()正是因为这个问题中描述的问题(它使用*而不是附加T)而被设计成这样。

另一个例子,利用已有的reduce()功能。我们有这样的功能:

(别问,没意义)

现在,减少狗列表似乎很简单:

不幸的是,这是不可能的,因为编译器不知道如何正确S推断Animal. 我们不能轻易地S只提供,甚至提供返回类型在这里也无济于事:

我们需要使用一些尴尬的解决方法:

0 投票
1 回答
102 浏览

kotlin - 为什么我不能在 Kotlin 中创建 BigDecimal 的扩展?

我正在尝试将扩展创建为属性,并且我也尝试了扩展功能,下面是一个示例BigDecimal

Kotlin 似乎既不承认HUNDRED也不承认HUNDRED_ONE()。我正在使用 Kotlin 版本1.5.21

1.5.21我在无法正常工作的 Kotlin 版本上做错了什么吗?

我之前已经将这个功能用于列表。例如:

0 投票
1 回答
82 浏览

unit-testing - Companion 对象内的模拟扩展功能

我有一个类(A 类),为了组织问题,我在另一个类(B 类)的伴随对象中定义了一个扩展函数(A.extension())。

在我的测试中,我需要:

  • 要使用真正的 A 类实例。
  • 模拟 A.extension()。
  • 使用 B 类的模拟实例。

使用 MockK-library 我无法成功模拟该扩展功能。我试过了:

结果:尝试运行扩展功能的未模拟版本。

结果:它没有找到伴随对象。

结果:编译错误 -> 'extension' 同时是一个成员和一个扩展。不允许引用此类元素。

我是否遗漏了一些关于如何模拟这个的东西?我在阻止这种模拟的代码结构方面做错了吗?

任何帮助表示赞赏。

0 投票
1 回答
50 浏览

kotlin - 如何将注解 @IntRange 用于 Integer 的 Kotlin 扩展函数

下面是我的 Kotlin 扩展功能:

像这样调用:

而我的要求是: 调用者必须大于8400。

我怎样才能做到这一点?

谢谢 !

0 投票
0 回答
35 浏览

kotlin - 在 Kotlin 中一次将扩展功能应用于多种类型

是否可以一次将扩展功能应用于多种类型?有东西链接这个

0 投票
2 回答
98 浏览

android - 如何在 Kotlin 中创建具有多个接收器的扩展函数?

我希望我的扩展功能有几个接收器。例如,我希望函数handle能够同时调用CoroutineScopeIterable实例的方法:

我认为这可能有效:

但这给了我一个错误:

我知道我可以创建带有参数的函数,但是

单个函数是否可以有多个接收器,以及如何在没有参数的情况下做到这一点?