karelpeeters
abstract class Foo<S: Foo<S>>{ fun common(): S = copy() abstract fun copy(): S } class Bar: Foo<Bar> { override fun copy() = Bar() } Bar().common() //returns a Bar instance