8

次のようなThreadUtilsメソッドを持つ既存の Java クラスがあります。every

public class ThreadUtil {

    public static Thread every(int seconds, Runnable r) {
        Thread t = new Thread(() -> {
            while(true) {
                r.run();
                try {
                    Thread.sleep(1000 * seconds);
                } catch (InterruptedException e) {
                    return;
                }
            }
        });
        t.start();
        return t;
    }
}

そして、それをKotlinに変換しようとしています。私は Runnable の閉鎖に少し夢中になっています。これは悪い で失敗しますreturn:

fun every(seconds: Int, r: Runnable): Thread {
    val t = Thread({
        while (true) {
            r.run()
            try {
                Thread.sleep((1000 * seconds).toLong())
            } catch (e: InterruptedException) {
                return // ERROR: This function must return a value of type Thread
            }
        }
    })
    t.start()
    return t
}

また、物事を分離するのを助けるためだけにRunnableを引き出してみましたが、これも同じように失敗します:

fun every(seconds: Int, r: Runnable): Thread {
    val internalRunnable = Runnable {
        while (true) {
            r.run()
            try {
                Thread.sleep((1000 * seconds).toLong())
            } catch (e: InterruptedException) {
                return // ERROR: This function must return a value of type Thread
            }
        }
    }
    val t = Thread(internalRunnable)
    t.start()
    return t
}

定義されている関数から@FunctionalInterface実行しようとしない、または同様のスタイルのクロージャー/ラムダを実装するにはどうすればよいですか?return

4

1 に答える 1