有没有更简单的方式来表达Kotlin中的匿名类?

我翻译了这个Java

new Thread("Cute Thread") { public void run() { int a = 3; } }.start(); 

到这个Kotlin

 object : Thread("Cute Thread") { override fun run() { val a = 3 } }.start() 

但是我觉得有这样一个更简单的方法,但我找不到任何例子。

我试过了

  Thread("Cute Thread") { val a = 3 }.start() 

但没有成功…

PS。 我知道,像这样开始一个线程是一个不好的做法。

4 Solutions collect form web for “有没有更简单的方式来表达Kotlin中的匿名类?”

这里的一个问题是Thread类的构造函数的Kotlin参数错误。 对于Runnable您可以轻松使用SAM转换 ( 单个方法接口可以视为lambda表达式 ),但是因为lambda不是最后一个参数,所以看起来有点笨拙。 在只有一个参数的情况下,它是好的:

 Thread { val a = 3 }.start() 

但是,如果有多个参数,它们会反过来导致这个丑陋的语法,lambda作为括号内的参数:

 Thread({ val a = 3 }, "some name").start() 

相反,你应该使用Kotlin stdlib函数thread()

使用该功能,您可以使用以下简单的语法:

 // create thread, auto start it, runs lambda in thread thread { val a = 3 } // create thread with given name, auto start it, runs lambda in thread thread(name = "Cute Thread") { val a = 3 } // creates thread that is paused, with a lambda to run later thread(false) { val a = 3 } // creates thread that is paused with a given name, with a lambda to run later thread(false, name = "Cute Thread") { val a = 3 } 

另请参见: thread()函数文档

没有什么不同的方式来实现一个匿名类( SAM转换除外)。
但是您仍然可以通过以下方式简化代码:

  Thread({ val a = 3 }).start() 

或与线程名称:

 Thread({ val a = 3 }, "Cute Thread").start() 

你的代码是绝对正确的。 简化它的唯一方法是将逻辑提取到一个函数中,然后再使用它:

 fun newThread(name: String, block: () -> Unit): Thread { return object : Thread(name) { override fun run() = block() }.start() } 

用法:

 newThread("Cute Thread") { val a = 3 } 

如果你想在你的匿名类中扩展/实现一些类/接口,除了:

 object: Thread("Name"){ //... }.start() 

当然,最简单的结构是:

 val adhoc = object{ // some code here } 

但没有更简单的方法来做到这一点。

文档 ,但你可能读过。

  • Kotlin未解决的参考:来自gradle上的println
  • 如何将一个集合的内容添加到新的集合
  • maven-source-plugin不适用于kotlin
  • Android Dagger 2.11与Kotlin,ContributesAndroidInjector注解问题
  • Kotlin:创建扩展函数文件?加
  • Int :: class.javaPrimitiveType.kotlin引用不等于Int :: class.javaObjectType.kotlin
  • 从Long到ByteArray的两次转换有什么区别?
  • 如何初始化Kotlin的最后一个字段?
  • 生成Kotlin方法/类的注释
  • 如何引用Kotlin中的密封构造函数?
  • java.lang.ClassNotFoundException:com.intellij.junit5.JUnit5IdeaTestRunner在kotlin中使用spek
  • Kotlin language will be the best programming language for Android.