当前位置: 首页 > 知识库问答 >
问题:

如何在静态编程语言中定义泛型函数接口?

全彬
2023-03-14

我正在学习静态编程语言,我在函数方面有一些问题。我试图创建一个带有通用参数的函数接口。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中具有边界的泛型参数的函数重用的函数签名呢?

共有1个答案

卢元龙
2023-03-14

大多数时候(总是?)在接收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语句没有正确工作,并因此给出错误。 抱歉给您带来不便。我祝你下周过得愉快。我检查了第一个答案,认为是正确的。