Tag: 扩展方法

如何在Kotlin中编写一个通用的扩展方法?

在我正在开发的一个项目中,我发现自己为某些类型编写了一些扩展方法,如果可选项为null,则返回一个默认值。 例如,我可能有一个Boolean? 对象,我想在默认为false的条件表达式中使用它,所以我会写: if (myOptional?.default(false)) { .. } 我已经写了几种类型: fun Boolean?.default(default: Boolean): Boolean { return this ?: default } fun Long?.default(default: Long): Long { return this ?: default } fun Int?.default(default: Int): Int { return this ?: default } 我想知道是否有办法做到这一般,所以我可以写一个扩展方法,我可以使用所有类型?

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内联方法不可见,除非扩展类

我在一个库中遇到了一个问题,我正在写零垃圾回收。 我写了一个myFunction函数,但我有一个问题,我不能调用函数,除非我扩展类(在这种情况下) RandomClass package com.charlatano fun main(args: Array<String>) { val hello = RandomClass<String>() hello.myFunction { // Unresolved reference: myFunction } } class myClass { private val list = RandomClass<String>() fun loop() { list.myFunction { // Unresolved reference: myFunction } } } class myClassInherit : RandomClass<String>() { private val list = RandomClass<String>() fun loop() { list.myFunction […]

在使用Ktor的HTML构建器时,如何将部分代码提取到Kotlin的局部变量中?

我想了解Kotlin / Ktor中的HTML生成器。 这里的示例使用HTML生成器来生成结果: call.respondHtml { head { title { +"HTML Application" } } body { h1 { +"Sample application with HTML builders" } widget { +"Widgets are just functions" } } } 我正在尝试将这个身体提取到像这样的变量中: val block: HTML.() -> Unit = { head { title { +"HTML Application" } } body { h1 { +"Sample application […]

Gradle构建中未解决的Kotlin扩展函数的引用

我有用Kotlin编写的所有代码构建多个项目Gradle。 有两个项目:普通和客户端。 子项目在中间文件夹,说“演示”。 所以文件夹结构是: project demo client build.gradle common build.gradle build.gradle gradle.properties settings.gradle settings.gradle: rootProject.name = 'demo' include 'demo/client' include 'demo/common' 客户端依赖于通用项目compile project(":demo/common") 。 共同项目中有一个扩展功能: fun <T> List<Future<T>>.getAll(): Long { var count = 0L this.forEach { it.get() count++ } return count } 如果我尝试在客户端项目中使用它,我会在编译时得到Unresolved reference: getAll异常。 用法: … import org.sandbox.imdg.hazelcast.common.utils.getAll class CassLoader { fun loadCalcData(): Long […]

我有两个Kotlin扩展方法为同一类,但具有不同的通用签名和编译器抱怨

我正在为同一个类写两个扩展函数: class Something<T:Any> { … } 他们看着像是: fun Something<Int>.toJson(): String = … fun Something<Double>.toJson(): String = … 并导致编译器错误: Kotlin:平台声明冲突:以下声明具有相同的JVM签名 如何创建两个只有泛型签名不同的扩展函数? 或者是不可能的? 注意: 这个问题是由作者故意编写和回答的( 自我回答问题 ),所以对于常见的Kotlin主题的答案是在SO中。 它起源于Kotlin松懈的 #通道。

在Java中使用静态方法作为Kotlin中的扩展方法

我有一个在Java中声明的静态方法: class X { public static void foo(Y y) { … } } 我很想用这个方法作为Kotlin中Y类型实例的扩展方法: import X.foo … y.foo() 那可能吗? 我可以控制所有有问题的源代码,例如添加注释。

有没有一种干净的方式在Kotlin中使用Groovy的扩展方法?

例如,Groovy允许获取由java.nio.file.Path表示的文件的文本,如下所示: // Groovy code import java.nio.file.Path import java.nio.file.Paths Path p = Paths.get("data.txt") String text = p.text 我希望能够在Kotlin中重用Groovy的text扩展方法。 请注意 :我知道Kotlin在这个特殊情况下有一个相关的方法 。 不过,可能有Groovy方法对Kotlin用户很有用。