raulraja
01/30/2018, 7:26 PMinterface Empty<A> {
fun empty(): A
}
val emptyStringProvider: Empty<String> = object : Empty<String> {
override fun empty(): String = ""
}
fun <A> empty(/* injected */ ev: Empty<A>): A = ev.empty()
empty<String>() //compiles because a provider for `Empty<String>` is found
empty<Int>() //does not compile because no evidence is provided for `Empty<Int>`