docs: private boolean matches(ParameterizedType requiredType, ParameterizedType beanType) {
          if (!requiredType.getRawType().equals(beanType.getRawType())) {
              return false;
          }
          if (requiredType.getActualTypeArguments().length != beanType.getActualTypeArguments().length) {
              throw new IllegalArgumentException("Invalid argument combination " + requiredType + "; " + beanType);
          }
          for (int i = 0; i < requiredType.getActualTypeArguments().length; i++) {
              if (!parametersMatch(requiredType.getActualTypeArguments()[i], beanType.getActualTypeArguments()[i])) {
                  return false;
              }
          }
          return true;
      }