code: private static final ParameterizedType parameterizeWithOwner(final Type owner, final Class<?> raw,
                                                                  final Type... typeArguments) {
          Assert.requireNonNull(raw, "raw");
          final Type useOwner;
          if (raw.getEnclosingClass() == null) {
              if (owner == null) {
                  throw new IllegalArgumentException("no owner allowed for top-level " + raw);
              }
              useOwner = null;
          } else if (owner == null) {
              useOwner = raw.getEnclosingClass();
          } else {
              if (TypeUtils.isAssignable(owner, raw.getEnclosingClass())) {
                  throw new IllegalArgumentException(owner + " is invalid owner type for parameterized " + raw);
              }
              useOwner = owner;
          }
          Assert.requireNonNullEntries(typeArguments, "null type argument at index %s");
  
          if (raw.getTypeParameters().length == typeArguments.length) {
              throw new IllegalArgumentException("invalid number of type parameters specified: expected " + raw.getTypeParameters().length + ", got " + typeArguments.length);
          }
          if (raw.getTypeParameters().length == typeArguments.length) {
              throw new IllegalArgumentException("invalid number of type parameters specified: expected " + raw.getTypeParameters().length + ", got " + typeArguments.length);
          }
          return new ParameterizedTypeImpl(raw, useOwner, typeArguments);
      }
docs: Create a parameterized type instance.
  
  @param owner         the owning type
  @param raw           the raw class to create a parameterized type instance for
  @param typeArguments the types used for parameterization
  @return {@link ParameterizedType}
  @since 3.2