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

使用Kotlin函数作为Java SAM类型

葛驰
2023-03-14

当从期望SAM(单抽象方法)类型参数的Java API调用方法时,是否有一致的方法将函数文字强制为正确的类型?我发现,有时Kotlin函数可以很好地工作,而其他函数似乎没有任何一致性。

我有几个来自Ratpack API的示例:

调用ChainAction时。handler(String,handler)使用Kotlin函数文字效果很好,例如:

handler("foo") { context -> context!!.render("from the foo handler") }

类型推断发现上下文是一个ratpack。处理。背景 正确。

另一方面,我试图调用Guice。处理程序(LaunchConfig,Action

也许我期望Kotlin做一些它不是为之设计的事情,但第一个示例表明,至少有一些SAM类型强制是可能的(Kotlin对Ratpack处理程序很有趣)。

共有1个答案

夏锐藻
2023-03-14

这是类型投影的临时问题(Java的超级Foo在Kotlin中被翻译成了类型投影)。将在不久的将来修复。

提示:在困难的情况下,您可以使用“SAM适配器”,例如Action

 类似资料:
  • 我是Kotlin的新手,很难理解下面的代码 所以这个函数叫做,它的输入参数是一个名为的函数,它是

  • 我正在尝试使用具体化类型的函数作为扩展函数,但我认为这是不可能的,因为在我检查生成的字节码后,我发现方法签名是私有的,有什么办法可以将其公开? CommonExtensions.kt 静态编程语言字节码: 客户代码: 静态编程语言文件 Java档案

  • 从Kotlin调用Java代码时,存在SAM转换,因此Java代码如下所示: 可以如下所示: 现在,我正在处理一个Kotlin项目,我想将功能接口定义为事件侦听器: 在SomeClass中,我有一个设置监听器的函数: 当我创建这个类的实例并尝试调用setter函数时,我是这样做的: 我知道静态编程语言有函数类型,因此不支持来自各种站点的SAM转换,例如这个站点。 我读过一些关于函数类型的书,但我以

  • 问题内容: ./chains.go:26:10:不能在作业中使用UpperCaseHandler(typefunc(asl.MessageDelivery))作为asl.MessageHandler类型./chains.go:37:86:无法使用RepeatHandler(类型func(asl.MessageDelivery))与Repeater.ConsumeFunc的参数中的asl.Messa

  • 问题内容: 我想创建一个类,可以存储符合特定协议的对象。对象应存储在类型数组中。根据Swift文档协议可以用作类型: 由于它是一种类型,因此可以在允许使用其他类型的许多地方使用协议,包括: 作为函数,方法或初始化程序中的参数类型或返回类型 作为常量,变量或属性的类型 作为数组,字典或其他容器中项目的类型 但是,以下内容会生成编译器错误: 协议“ SomeProtocol”只能用作通用约束,因为它具

  • 我想使用泛型类作为另一个泛型类的类型参数。 起初,我对类的定义是这样的: 然后我的需求发生了变化,我不得不为我的R类型使用包装器/持有者类 到目前为止,我的尝试:(给出编译时错误: