我翻译了这个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。我知道开始这样的线程是一种不好的做法。
答案 0 :(得分:4)
实现匿名类没有不同的方式(SAM conversions除外) 但您仍然可以通过以下方式简化代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace LoginSystem
{
public class dialog_SignUp : DialogFragment
{
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
base.OnCreateView(inflater, container, savedInstanceState);
}
}
}
或使用主题名称:
Thread({ val a = 3 }).start()
答案 1 :(得分:2)
您的代码绝对正确。简化它的唯一方法是将逻辑提取到函数中然后重用它:
fun newThread(name: String, block: () -> Unit): Thread {
return object : Thread(name) {
override fun run() = block()
}.start()
}
用法:
newThread("Cute Thread") {
val a = 3
}
答案 2 :(得分:1)
如果你想在你的匿名类中扩展/实现一些类/接口,除了:
之外别无他法。object: Thread("Name"){
//...
}.start()
最简单的结构当然是:
val adhoc = object{
// some code here
}
但没有更简单的方法可以做到这一点。
Documentation,但你可能已经读过了。
答案 3 :(得分:1)
这里的一个问题是Thread
类构造函数的参数在Kotlin中的顺序不正确。对于Runnable
,您可以轻松使用SAM conversion(单个方法接口可以视为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 }