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

为什么Lambda表达式对于静态编程语言和Java类的行为不同?[复制]

张晨朗
2023-03-14

为什么我可以将Lambda用于类java。lang.Thread,但不用于MyThread?

interface MyRunnable{
    fun run()
}

class MyThread(runnable : MyRunnable){    
}

fun test(){
    Thread({})     // All Alright

    MyThread({})   //Exception. Type mismatch <<-- Why ?
}

链接以检查此示例:https://try.kotlinlang.org/#/UserProjects/tbs79qfkh50psp7r3qrdrinrmt/sfkpjq1bjvg4r6d5rmnu6mp4a8

共有1个答案

萧浩漫
2023-03-14

从SAM转换文件中:

请注意,此功能仅适用于Java互操作;由于静态编程语言具有适当的函数类型,因此无需将函数自动转换为静态编程语言接口的实现,因此不受支持。

换句话说,使用 语法仅支持对Java的调用。公众的理由是,您可以执行以下任一操作:

>

  • 让您的MyThread构造函数将一级函数类型作为参数。

    使用对象表达式:

    MyThread(object : MyRunnable {
        override fun run() {}
    })
    

    这显然相当冗长。然而,根据这张Kotlin票据,lambda语法实际上只是Java互操作的一部分,而不是核心语言的一部分,因此需要进行一些仔细的设计才能完成更多的工作。

  •  类似资料:
    • 我是科特林的新手。因此,我在Android Studio中创建了一个kotlin项目,并导入了片段ktx和活动ktx依赖项。在片段中,我右键单击片段,然后转到- 这是我的应用程序。梯度锉

    • 我有一个Spring自动配置库,我是Swagger的开发者。它是使用Spring Boot用Kotlin编写的。 我的主要自动配置定义为: 我有几个类,见下面的主类,它们作为bean使用注入到上面的类中。我想使用新的从我的主自动配置类中删除丑陋的。 源代码存储在我的GitHub回购https://github.com/opengoodio/swagger-auto-configuration. 主

    • 问题内容: 我的理解是Java的正则表达式实现是基于Perl的。但是,在下面的示例中,如果我使用相同的字符串执行相同的regex,则Java和Perl返回不同的结果。 这是Java示例: 返回值:不匹配 这是Perl的示例: 返回:匹配项 对我来说,Perl的结果很有意义。它寻找单个单词字符的匹配项。我不明白为什么Java不认为这是一个匹配。差异的原因是什么? 问题答案: Java 方法正在测试正

    • 正如标题所说,我正在尝试将Java和Kotlin混合在一个项目中。这里有一个很好的例子。混合java kotlin hello world。除了kotlin在src/main/Java/somepackage/SomeClass中找不到我的任何Java类之外,所有的东西都正常工作。Java语言 这是什么原因? 我的身材。gradle看起来像这样 而不是开始尝试在更大的项目上实现这一点。我试图通过创

    • 在我的项目中,我有文件为FooClass类定义模式。我还配置了,以便在构建时为我生成类。 为什么我仍然需要指定架构注册表URL?难道我的使用者不能使用项目中的文件反序列化我的Kafka消息的值吗?

    • 我刚刚开始使用抽象类,重写val和singeltons。但是,我刚刚遇到了一个非常奇怪的行为。我的目标是拥有一个抽象类,然后创建几个扩展该抽象类的singeltons。因为我需要某些变量,所以我创建了抽象val,然后可以在子类中覆盖它(而不是通过构造函数传递它们)。 所以我上了4节课: 主要活动: 实例: 对象 AClass: 输出: 在此之后,我意识到被覆盖可能直到执行 之后才会初始化。但后来我