So this compiles:
protocol A {}
protocol B: A {}
func asd<T: A>(_: T.Type) { print("asd<T: A>() called") }
func asd<T: B>(_: T.Type) { print("asd<T: B>() called") }
func qwe<T: A>(_ type: T.Type) { asd(type.self) }
But this doesn't:
protocol A {}
protocol B: A {}
func asd<T: A>(_: T.Type) { print("asd<T: A>() called") }
func asd<T: B>(_: T.Type) { print("asd<T: B>() called") }
func qwe(_ type: A.Type) { asd(type.self) }
Because the compiler has to know the type for every asd call, so it knows which specialized methods to generate from that 1 generic method.