if (l2.size() > i){ Type t2 = (Type)l2.get(i);
    public boolean callValidImpl(List argTypes){        if (this.isGeneric()){            try {                List inferredTypes = ((JL5TypeSystem)typeSystem()).inferTypesFromArgs(typeVariables(), formalTypes(), argTypes, new ArrayList());                return genericCallValidImpl(argTypes, inferredTypes);            }            catch(SemanticException e){                return false;            }        }        List l1 = this.formalTypes();        List l2 = argTypes;        for (int i = 0; i < l1.size(); i++){            Type t1 = (Type)l1.get(i);            if (l2.size() > i){                Type t2 = (Type)l2.get(i);                           if (t1 instanceof JL5ArrayType && ((JL5ArrayType)t1).isVariable()){                    if (ts.isImplicitCastValid(t2, t1)){                        return true;                    }                    for (int j = i; j < l2.size(); j++){                        Type tv = (Type)l2.get(j);                        if (!ts.isImplicitCastValid(tv, ((ArrayType)t1).base())){                            return false;                        }                    }                }                else {                    if (!ts.isImplicitCastValid(t2, t1)) {                        return false;                    }                }            }            else {                if (t1 instanceof JL5ArrayType && ((JL5ArrayType)t1).isVariable()){                    return true;                }                else {                    return false;                }            }        }        return true;     }