code: @SuppressWarnings("unchecked")
      public static <T> Key<T> resolveKey(Class<T> injecteeClass, Class<? extends T> genericImplClass,
              Type... typeVariableClasses) {
          Optional<Annotation> qualifier = Annotations.on(genericImplClass)
                  .findAll()
                  .filter(AnnotationPredicates.annotationAnnotatedWith(Qualifier.class, false))
                  .findFirst();
          TypeLiteral<T> genericInterface = (TypeLiteral<T>) TypeLiteral.get(
                  Types.newParameterizedType(injecteeClass, typeVariableClasses));
          return qualifier.map(annotation -> Key.get(genericInterface, annotation)).orElseGet(
                  () -> Key.get(genericInterface));
      }
docs: Resolve the key for injectee class, including qualifier from implClass and resolved type variables.
  <p>
  Useful when we can not resolve type variable from one implementation.
  
  @param injecteeClass       the injectee class
  @param genericImplClass    the generic implementation
  @param typeVariableClasses the type variable classes
  @return {@link com.google.inject.Key}