我正在学习静态编程语言,我在函数方面有一些问题。我试图创建一个带有通用参数的函数接口。Java我会创建这样的东西:
@FunctionalInterface
public interface Foo<T extends Bar> {
String something(T arg);
}
然后我可以在其他地方像这样使用它(给定Person
扩展Bar
:
Foo<Person> f = p -> p.toString();
你是怎么和Kotlin写这篇文章的?
我尝试的第一件事是使用如下类型别名:
typealias Foo<T> = (T) -> String
但是,当我将绑定添加到type参数时,它停止了工作:
typealias Foo<T: Bar> = (T) -> String // Error: Bounds are not allowed on type alias parameters
第二种方法是编写一个扩展函数类型的接口:
interface Foo<T: Bar> : (T) -> String
然而,现在我不知道如何用这个来实例化lambda函数。当我从中创建类时,它会这样工作:
class Something: Foo<Person> {
override fun invoke(p: Person): String {
return p.toString()
}
}
val f = Something()
但这是一个很大的开销,我相信一定有更好的解决方案。
那么,我如何定义一个可以被许多支持kotlin中具有边界的泛型参数的函数重用的函数签名呢?
大多数时候(总是?)在接收lambda的函数的参数中定义lambda的类型就足够了。
例如:
open class Bar
class Person: Bar()
var f = { p: Person -> p.toString() }
fun <T : Bar> withFoo(block: (T) -> String) { }
fun <T : Bar> otherFoo(block: (T) -> String) { }
fun main() {
withFoo(f)
otherFoo(f)
}
与Kotlin文档所述的方式相同:“由于Kotlin具有适当的函数类型,因此不需要将函数自动转换为Kotlin接口的实现,因此不受支持。”
看见https://kotlinlang.org/docs/reference/java-interop.html#sam-转换
有了这个数据模型... TestClass.kt 我的目标是反序列化以下json值: 我在这里看到了解决方案并尝试了这个,但是我的“反序列化”方法中的断点似乎永远不会命中。 选项Deserializer.java TestDeserialization.kt 建筑gradle(用于版本信息)
假设我想要一个类型变量T,它扩展了某个类并实现了一个接口。类似于: Kotlin中的语法是什么?
为了描述Gradle构建脚本,我们可以通过< code>build.gradle.kts文件使用Kotlin。在< code>dependencies和build 部分全局定义要使用的Kotlin版本是一个常见的问题(在给定的情况下使用不同的版本是相当罕见的)。 请考虑以下代码 (Gradle 4.3.1): 如您所见,kotlin(在本例中为1.2.30)定义了两次:和,它们通常没有区别。由于D
我知道内联函数可能会提高性能 编译器可以发出以下代码,而不是为参数创建函数对象并生成调用。(来源) 但是我发现没有kotlin为一个非内联函数创建的函数对象。为什么?
我希望函数位于类中(不污染全局名称空间),但可以静态访问(从不创建它们所在的对象)。提议的解决办法: 这是一个好的解决方案,还是不可避免地会创建一个对象?我应该使用哪种图案?
我正在为我的应用程序创建登录页面,它给了我。 它只在错误和响应中给出错误。知道为什么会这样吗? 问题出现了,因为我没有正确检查所有的括号,因此if语句没有正确工作,并因此给出错误。 抱歉给您带来不便。我祝你下周过得愉快。我检查了第一个答案,认为是正确的。