private BeanKey findParameterKey(final Object parameterOwner, final Class<?> parameterClass,
                                     final Type parameterType, final Annotation[] annotations) {
        final String qualifier = qualifierHandler.getQualifier(parameterOwner, annotations);

        if (isProvider(parameterClass)) {
            final TypeLiteral<?> beanTypeFromProvider = getBeanTypeFromGenericType(parameterOwner, parameterType);
            return new ProviderBeanKey(beanTypeFromProvider, qualifier);
        }

        else if (isCollection(parameterClass)) {
            final TypeLiteral<?> actualBeanType = new InputBasedTypeLiteral(parameterType);
            final TypeLiteral<?> beanTypeFromCollection = getBeanTypeFromGenericType(parameterOwner, parameterType);
            return new CollectionBeanKey(actualBeanType, beanTypeFromCollection, qualifier);
        }

        else if (isCollectionProvider(parameterClass)) {
            final TypeLiteral<?> beanTypeFromCollectionProvider = getBeanTypeFromGenericType(parameterOwner, parameterType);
            return new CollectionProviderBeanKey(beanTypeFromCollectionProvider, qualifier);
        }

        else {
            final TypeLiteral<?> beanType = new InputBasedTypeLiteral(parameterType);
            return new BeanKey(beanType, qualifier);
        }
    }