Time for new battery of Kotlin puzzlers. In this week we’ve concentrated more on teaching and showing surprising facts about Kotlin. Have fun :)

Lambda runnables

fun run() {

val run: () -> Unit = {

println("Run run run!")

} object : Runnable {

override fun run() = run()

}.run()

} run()

Author: Redrield

What will it display? Some possibilities:

a) “Run run run!”

b) Doesn’t compile

c) StackOverflowError

d) None of the above

Check out answer and explanation using this link or by reading this article till the end.

Making open abstract

open class A {

open fun a() {}

} abstract class B: A() {

abstract override fun a()

} open class C: B()

a) Compiles fine

b) Error: Class ‘C’ is not abstract and does not implement abstract base class member

c) Error: ‘a’ overrides nothing

d) Error: Function ‘a’ must have a body

Author: Marcin Moskala

This fact is not well known, but it might help you one day ;)

Check out answer and explanation using this link or by reading this article till the end.

List minus list

val list = listOf(1, 2, 3)

print(list - 1)

print(list - listOf(1)) val ones = listOf(1, 1, 1)

print(ones - 1)

print(ones - listOf(1))

What does it display? Some possibilities:

a) [2, 3][2, 3][1, 1][1, 1]

b) [2, 3][2, 3][1, 1][]

c) [1, 3][2, 3][][1, 1]

d) [2, 3][2, 3][][]

Author: Marcin Moskala

Another peace of surprising knowledge that can save you one day from hours of searching for error ;)

Check out answer and explanation using this link or by reading this article till the end.

Answers and explanations

For “Lambda runnables” correct answer is:

a) “Run run run!”

Why? Here is an explanation:

In object expression, Kotlin prefers to use `run` defined as a local variable. Be careful! This won’t work well:

val run: () -> Unit = {

println("Run run run!")

} fun run() {

object : Runnable {

override fun run() = run()

}.run()

}

Nor this:

fun run() {

val run: () -> Unit = {

println(“Run run run!”)

}

object : Runnable {

override fun run() = this.run()

}.run()

}

For “Making open abstract” correct answer is:

b) Error: Class ‘C’ is not abstract and does not implement abstract base class member

Why? Here is an explanation:

We can override an open function with abstract one, but then it is abstract and we need to override it in all subclasses. This works fine:

open class A {

open fun a() {}

} abstract class B: A() {

abstract override fun a()

} open class C: B() {

override fun a() {}

} C().a()

For “List minus list” correct answer is:

b) [2, 3][2, 3][1, 1][]

Why? Here is an explanation: