protocol EquatableOpener { init<T>(_ value: T) init<T: Equatable>(_ value: T) } func openEquatable<EO: EquatableOpener>(_ value: Any, openerType: EO.Type) -> EO { // 黒魔術 }