code: public static boolean isProperType(ResolvedType type) {
          if (type instanceof InferenceVariable) {
              return false;
          }
          if (type instanceof ResolvedReferenceType) {
              ResolvedReferenceType referenceType = (ResolvedReferenceType) type;
              return referenceType.typeParametersValues().stream().allMatch(it -> isProperType(it));
          }
          if (type instanceof ResolvedWildcard) {
              ResolvedWildcard wildcard = (ResolvedWildcard)type;
              if (wildcard.isBounded()) {
                  return isProperType(wildcard.getBoundedType());
              } else {
                  return true;
              }
          }
          if (type.isPrimitive()) {
              return true;
          }
          if (type.isTypeVariable()) {
              // FIXME I am not sure...
              return false;
          }
          if (type.isArray()) {
              return isProperType(type.asArrayType().getComponentType());
          }
          throw new UnsupportedOperationException(type.toString());
      }
docs: The term proper type excludes such "types" that mention inference variables.