Tag: 函数

Kotlin:一个类型的扩展函数如何在外部访问?

我经常遇到这种情况,我在一个类型中有抽象扩展函数。 interface PetScript { fun Pet.feed() fun Pet.call() } 具有扩展功能的功能允许非常简约的实现,因为它自动给出this上下文。 不幸的是,我知道使用这些函数的唯一方法是编写传递给扩展的样板标准函数。 interface PetScript { fun Pet.feed() fun Pet.call() fun feed_(pet: Pet) = pet.feed() fun call_(pet: Pet) = pet.call() } 这样我可以使用像这样的功能: val pet = … val script = … script.feed_(pet) script.call_(pet) 有没有更好的,更习惯的方式来使用类型之外的扩展函数?

Kotlin:UnsupportedOperationException用于get / set操作符

我试图将我的库中read和write的函数分别转换为运算符函数get和set 。 我的函数使用一个泛化的泛型类型,它们也是内联的方法。 (你可以在这里看到我的图书馆。) 编译器没有让我通过的问题,我不明白为什么使用非运算符函数推理工作得很好,但使用运算符在运行时失败。 Exception in thread "main" java.lang.UnsupportedOperationException: This function has a reified type parameter and thus can only be inlined at compilation time, not called directly. at kotlin.jvm.internal.Intrinsics.throwUndefinedForReified(Intrinsics.java:173) at kotlin.jvm.internal.Intrinsics.throwUndefinedForReified(Intrinsics.java:167) at kotlin.jvm.internal.Intrinsics.reifyJavaClass(Intrinsics.java:201) 代码如下: operator inline fun <reified T> get(address: Long): T { … } operator inline fun <reified T> get(address: Int): T […]

Kotlin:与lambda和泛型混淆

请在评论中看到错误信息: interface Printable {} class Book(val title: String) :Printable fun bookPrint(b: Book?):String = "Title: " + b?.title class Author(val name: String) :Printable fun authorPrint(a: Author?):String = "Name: " + a?.name // Unsupported: [modifier on parameter in function type] // ————-vv fun printIt(f: (in Printable?) -> String, a:Printable):String { return "Unknown: " + f.invoke(null) + "Known: […]

Kotlin:你能解释一下成员扩展功能吗?

我的代码如下: open class Particle class Electron : Particle() open class Element(val name: String) { open fun Particle.react(name: String): Unit { println("$name is reacting with a particle") } open fun Electron.react(name: String): Unit { println("$name is reacting with an electron") } fun react(particle: Particle): Unit { particle.react(name) } } fun main(args: Array<String>) { val selenium = […]

如何在Kotlin中为函数类型变量赋一个空值?

我有一个持有回调的变量,默认情况下,它的值应该为空。 但是这个语法似乎不起作用。 var callback1 : () -> Unit = null var callback2 : ((a) -> c, b) -> Unit = null 我目前的解决方案是确保回调有默认的实现。 var callback1 : () -> Unit = { } var callback2 : ((a) -> c, b) -> Unit = { a, b -> } 然而,这使得很难检查回调是否被设置,并且可能的默认实现有一些代价(是这样的?)。 如何在Kotlin中为函数类型变量赋一个空值?

Kotlin:泛型函数作为返回类型?

在Kotlin中,是否可以声明一个泛型函数类型作为函数的返回类型? 我想要在Java中看起来像这样: interface Factory { static Factory INSTANCE = new FactoryImpl(); <T> T create(String name, Class<T> type); } class PrefixedFactory implements Factory { private final String prefix; PrefixedFactory(String prefix) { this.prefix = prefix; } @Override public <T> T create(String name, Class<T> type) { return Factory.INSTANCE.create(prefix + name, type); } } (请注意,在本例中,我使用静态字段访问Factory实例,以避免将泛型函数作为参数传递,这会在Kotlin中显示自己的问题)。 我想将前缀转换为kotlin函数,但似乎不可能将泛型函数声明为返回类型: fun prefixer(prefix: String): […]

在kotlin中覆盖泛型的功能

例如,我有以下示例代码 fun f<T>( cb: (T, Int) -> Unit ): Unit { println("f called with cb which accepts 2 arguments"); } fun f<T>( cb: (T) -> Unit ): Unit { println("f called with cb which accepts 1 argument"); f<T> {item, position -> cb(item) } } fun main(args : Array<String>) { f { item -> } f […]

Mocktito ArgumentCaptor Kotlin lambda与参数

我试图在Kotlin上测试这个: verify(myInterface).doSomething(argumentCaptor.capture()) capture.value.invoke(0L) 哪里做什么: doSomething((Long) -> Unit) 我怎样才能为此创建一个ArgumentCaptor? 现在我正在做这个 inline fun <reified T : Any> argumentCaptor() = ArgumentCaptor.forClass(T::class.java)!! val captor = argumentCaptor<(Long) -> Unit>() verify(mainApiInterface!!).downloadUserProfilePicture(captor.capture()) captor.value.invoke(0L) 但是我得到java.lang.IllegalStateException:captor.capture()不能为空 我也尝试整合mockito-kotlin,但我得到一个PowerMockito错误: 在org.mockito.internal.MockitoCore的类层次结构中找不到名为“reported”的实例字段。