cy
interface A<out T : A<T>> { fun doSomething(): T } data class B(val str: String) : A<B> { override fun doSomething(): B { val c = copy() return c } }