code: public <TAbstract, TImplementation extends TAbstract> InjectorConfiguration withScopedAlias(
          Class scope,
          Class<TAbstract> abstractDefinition,
          Class<TImplementation> implementationDefinition
      ) {
          if (abstractDefinition.equals(Injector.class)) {
              throw new DependencyInjectionFailedException("Cowardly refusing to define a global alias for Injector since that would lead to a Service Locator pattern. If you need the injector, please define it on a per-class or per-method basis.");
          }
          //noinspection unchecked
          return new InjectorConfiguration(
              scopes, definedClasses,
              factories,
              factoryClasses,
              sharedClasses,
              sharedInstances,
              aliases.withModified(scope, (value) -> value.with(abstractDefinition, implementationDefinition)),
              collectedAliases,
              namedParameterValues
          );
      }
docs: Defines that instead of the class/interface passed in abstractDefinition, the class specified in
  implementationDefinition should be used. The specified replacement class must be defined as injectable.
  
  @param abstractDefinition the abstract class or interface to replace.
  @param implementationDefinition the implementation class
  @param <TAbstract> type of the abstract class/interface
  @param <TImplementation> type if the implementation
  
  @return a modified copy of this injection configuration.