public bool Validate(CodeGenerationOptions opt, GenericParameterDefinitionList in_params)
        {
            if (!gen.Validate(opt, in_params))
            {
                return(false);
            }

            is_concrete = true;
            type_params = new ISymbol [java_params.Length];
            for (int i = 0; i < java_params.Length; i++)
            {
                string tp  = java_params [i];
                var    gpd = in_params != null?in_params.FirstOrDefault(t => t.Name == tp) : null;

                if (gpd != null)
                {
                    type_params [i] = new GenericTypeParameter(gpd);
                    is_concrete     = false;
                    continue;
                }
                else if (tp == "?")
                {
                    if (in_params != null && in_params.Count == 1)
                    {
                        type_params [i] = new GenericTypeParameter(in_params [0]);
                        is_concrete     = false;
                    }
                    else
                    {
                        type_params [i] = new SimpleSymbol("null", "java.lang.Object", "object", "Ljava/lang/Object;");
                    }
                    continue;
                }

                ISymbol psym = SymbolTable.Lookup(tp, in_params);
                if (psym == null || !psym.Validate(opt, in_params))
                {
                    return(false);
                }

                if (psym is GenericSymbol && !(psym as GenericSymbol).IsConcrete)
                {
                    is_concrete = false;
                }
                type_params [i] = /*psym is IGeneric ? (psym as IGeneric).GetGenericType (null) : psym.FullName*/ psym;
            }
            tps = type_params == null ? null : "<" + String.Join(", ", (from tp in type_params select tp.FullName).ToArray()) + ">";
            return(true);
        }