interface Buffered { fun flush() } interface AIPowered { fun getAvatarReleaseYear(): Int } enum class BufferedEnum : Buffered { A, B; override fun flush() {} } enum class UsualEnum { C, D; } enum class CleverEnum : Buffered, AIPowered { E, F; override fun flush() {} override fun getAvatarReleaseYear() = 2022 } fun

processInfo1(info: String, printer: P) where P: Buffered, P: AIPowered { printer == 20 printer == BufferedEnum.A printer == UsualEnum.C printer == CleverEnum.E } fun

processInfo2(info: String, printer: P) where P: AIPowered, P: Buffered { printer == 20 printer == BufferedEnum.A printer == UsualEnum.C printer == CleverEnum.E } abstract class Printer { abstract fun print(command: String) } fun

processInfo3(info: String, printer: P) where P: Buffered, P: Printer { printer == 20 printer == BufferedEnum.A printer == UsualEnum.C printer == CleverEnum.E } fun test(a: Int, b: Any?) { a === b } fun <T: Int> rest(a: T, b: Any?) where T : String { a === b } fun <T: Any?> nest(a: Int, b: T) where T : String { a === b } fun <T: Int, K: Any?> mest(a: T, b: K) where T : String, K: Boolean { a === b }