我有静态编程语言为空的问题,我想知道我是否能够解决它与合同
fun <T, R> Action<T>.map(mapper:(R)->T): Action<R> {
return Action{ execute(mapper(it)) }
}
和
fun <T> Action<T>.ifNotNull(): Action<T> {
return Action { if(it != null) execute(it) }
}
还有一个具有可为空数据的通用模型:
class Model<T>(val data: T?)
现在我创建了一个函数,它以Action
接口作为参数。案例是仅当param!=空
,因此如下所示:
fun <T> callback(model: Model<T>, action: Action<T>){
action
.map{ it.getData() } //compilation error: getData return T? when action require T
.ifNotNull() //execute only when data!=null
.execute(model)
}
那么现在,有没有任何选项可以使用Kotlin契约来确保编译器不使用null参数执行操作
?
我创建了专门用于此用途的操作
接口实现,如下所示:
class ModelAction<T>(val action: Action<T>) : Action<T?> {
override fun execute(param: T?) {
param?.let {
action.execute(it)
}
}
}
fun callback<T>(model: Model<T>, action: Action<T>){
ModelAction(action)
.map{ it.getData() }
.execute(model)
}
这个想法可能会帮助有类似问题的人,但它不符合我的期望,我仍然依赖于基于高阶函数的解决方案。
默认情况下,如果未绑定,则所有类型参数都可以为null(换句话说,它们是从Any?
派生的)。解决这个问题的简单方法就是在类型参数上指定非空绑定:
ModelAction
在您自己的答案中,只需为ifNotNull()
提供正确的签名:
fun <T> Action<T>.ifNotNull(): Action<T?> {
return Action { if(it != null) execute(it) }
}
那么你的操作顺序就错了:
fun <T> callback(model: Model<T>, action: Action<T>){
action
.ifNotNull() // Action<T?>
.map { model: Model<T> -> model.data } // Action<Model<T>>
.execute(model)
}
请注意,编译器将无法推断此map
用法的R
。你也可以把它写成
fun <T> modelAction(action: Action<T>): Action<Model<T>> {
return action
.ifNotNull()
.map { it.data }
}
顺便说一下,这个参数是map
的错误方法;这样的函数通常被称为矛盾图
。
我有静态函数,它仅限于一些上下文(例如仅用于文档)。有两种替代方法可以将其定义为顶层函数或对象中的函数。 1. 2. 顶级函数的优点是它没有被包装在一个对象中,缺点是它可以从任何地方访问,没有类名前缀。这种情况有优点还是缺点或最佳实践?
我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?
在函数式编程中,我们可以将函数当作变量一样自由使用。一个函数接收另一个函数作为参数,这种函数称之为高阶函数(Higher-order Functions)。 看一个简单的例子: def func(g, arr): return [g(x) for x in arr] 上面的代码中,func 是一个高阶函数,它接收两个参数,第 1 个参数是函数,第 2 个参数是数组,func 的功能是将函数
如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。
我想为我的游戏创建一个简单的倒计时,当游戏开始时,我想每秒调用这个函数: 我试过这个: 但应用程序不幸停止,第二次调用run函数 3周前,我刚刚开始使用android开发和静态编程语言,到目前为止,我对它了解最多。 在Xcode中使用swift时,我使用了这一行,我认为类似的东西也适用于Kotlin
有可能从Java代码中访问扩展函数吗? 我在静态编程语言文件中定义了扩展函数。 其中MyModel是(生成的)java类。现在,我想在我的普通java代码中访问它: 然而,那是行不通的。IDE无法识别bar()方法,编译失败。 work使用kotlin的静态函数: 通过使用导入com.test.extensions.ExtensionsPackage我的IDE似乎配置正确。 我从kotlin文档中