abstract class Task<T> {
abstract fun execute(): T
}
class Greeting : Task<String>() {
override fun execute() = "hello"
}
object Runner {
inline fun <reified S : Task<T>, T> run(task: S): T = task.execute()
}
// *** before: ***
val resultOld: String = Runner.run<Greeting, String>(Greeting())
// *** in version 1.7: ***
val result: String = Runner.run<Greeting, _>(Greeting()) // the rest is inferred
fun main() {
println("$resultOld $result")
}