有没有更简单的方式来expressionKotlin中的匿名类?

我翻译了这个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。 我知道,像这样开始一个线程是一个不好的做法。

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

 Thread { val a = 3 }.start() 

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

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

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

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

 // 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 } 

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

文档 ,但你可能读过。