有没有更简单的方式来表达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 } 

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

文档 ,但你可能读过。

  • 在android studio 3.0 canary 4 ui预览中丢失的类
  • Int上的Kotlin引用平等行为,值介于-128到127之间
  • kotlin检查类型不兼容的类型
  • 什么Java 8 Stream.collect等价物在标准Kotlin库中可用?
  • 在Android Studio中找不到Dokka插件3
  • 隐式映射到Kotlin中设置
  • 如何禁用Android Kotlin中的点按钮
  • thead.join查杀正在运行的线程java(kotlin)
  • Kotlin lambda语法混淆
  • 使用Anko访问活动的视图
  • 在表达式中不允许赋值?
  • Kotlin language will be the best programming language for Android.