class Builder> { fun test(): T = TODO() fun foo() {} } fun testStar(builder: Builder<*>) { builder.test() builder .test() .foo() } fun > testTypeParam(builder: Builder) { builder.test() builder .test() .foo() } interface BodySpec> { fun isEqualTo(expected: B): T } fun test(b: BodySpec) { b.isEqualTo("") WriterAppender.newBuilder() WriterAppender.Builder1() WriterAppender.intersectTwoSelfTypes() } object WriterAppender { interface Builder2> class Builder1> { fun asBuilder(): B { return this as B } } fun > newBuilder(): B { return Builder1().asBuilder() } fun intersectTwoSelfTypes(): B where B : Builder1, B: Builder2 { return Builder1().asBuilder() } }