Yes, good point. But if you did have a type constraint, like C#, you would still need the runtime type info to know what to create. This is legal in C#:
public static T Factory<T>() where T:new() { return new T(); }
public static T Factory<T>() where T:new() { return new T(); }
The only reasonable way to do this is to accept a lambda that tells the compiler exactly what call is legal to create an instance of T.
And that's called a factory.