Avatar
@swift-main protocol P { static func equals(a: Self, b: Self) -> Bool } class C1: P { init() {} static func equals(a: C1, b: C1) -> Bool { true } } class C2: C1 { } func start(_ a: any P, _ b: any P) { open(a, b) } func open<T: P, U: P>(_ t: T, _ u: U) { guard let u = u as? T else { print("no") return } print("ok") _ = T.equals(a: t, b: u) } func check(_ a: C2, b: C1) { _ = C2.equals(a: a, b: b) } start(C1(), C2()) // ok start(C2(), C1()) // no