The service type is defined at compile time. This is normally in the form of an interface or a (sometimes abstract) base class. The key point here is Liskovs substitution principle
It states that, in a computer program, if S is a subtype of T, then objects of type T may be replaced with objects of type S (i.e., objects of type S may be substituted for objects of type T) without altering any of the desirable properties of that program (correctness, task performed, etc.)
So we know the contract of the type at compile time
Then what does it mean that dependency injection also occurs at Runtime?
When implementing DI, for example, using an Inversion of Control container the implementation type is not known until run time.