class Signature {

        private final String name;

        private final List<Type> parameterTypes;

        private Signature(String name, List<Type> parameterTypes) {
            this.name = name;
            this.parameterTypes = parameterTypes;
        }

        public String getName() {
            return name;
        }

        public List<Type> getParameterTypes() {
            return parameterTypes;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o)
                return true;
            if (o == null || getClass() != o.getClass())
                return false;
            Signature signature = (Signature) o;
            if (!name.equals(signature.name))
                return false;
            if (!parameterTypes.equals(signature.parameterTypes))
                return false;
            return true;
        }

        @Override
        public int hashCode() {
            int result = name.hashCode();
            result = 31 * result + parameterTypes.hashCode();
            return result;
        }

        public String asString() {
            return parameterTypes.stream().map(Type::asString).collect(joining(", ", name + "(", ")"));
        }

        @Override
        public String toString() {
            return asString();
        }
    }

    public Signature getSignature() {
        return new Signature(getName().getIdentifier(), getParameters().stream().map(this::getTypeWithVarargsAsArray).map(this::stripGenerics).map(this::stripAnnotations).collect(toList()));
    }

    private Type stripAnnotations(Type type) {
        if (type instanceof NodeWithAnnotations) {
            ((NodeWithAnnotations) type).setAnnotations(new NodeList<>());
        }
        return type;
    }

    private Type stripGenerics(Type type) {
        if (type instanceof NodeWithTypeArguments) {
            ((NodeWithTypeArguments) type).setTypeArguments((NodeList<Type>) null);
        }
        return type;
    }

    private Type getTypeWithVarargsAsArray(Parameter p) {
        /* A signature includes the varargs ellipsis.
         This is a field on parameter which we lose when we only get the type,
         so we represent it as an additional [] on the type. */
        Type t = p.getType().clone();
        if (p.isVarArgs()) {
            t = new ArrayType(t);
        }
        return t;
    }

    @Override
    @Generated("com.github.javaparser.generator.core.node.CloneGenerator")
    public CallableDeclaration<?> clone() {
        return (CallableDeclaration<?>) accept(new CloneVisitor(), null);
    }

    @Override
    @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator")
    public CallableDeclarationMetaModel getMetaModel() {
        return JavaParserMetaModel.callableDeclarationMetaModel;
    }

    @Override
    @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator")
    public boolean replace(Node node, Node replacementNode) {<FILL_FUNCTION_BODY>

        if (node == null) {
            return false;
        }
        for (int i = 0; i < modifiers.size(); i++) {
            if (modifiers.get(i) == node) {
                modifiers.set(i, (Modifier) replacementNode);
                return true;
            }
        }
        if (node == name) {
            setName((SimpleName) replacementNode);
            return true;
        }
        for (int i = 0; i < parameters.size(); i++) {
            if (parameters.get(i) == node) {
                parameters.set(i, (Parameter) replacementNode);
                return true;
            }
        }
        if (receiverParameter != null) {
            if (node == receiverParameter) {
                setReceiverParameter((ReceiverParameter) replacementNode);
                return true;
            }
        }
        for (int i = 0; i < thrownExceptions.size(); i++) {
            if (thrownExceptions.get(i) == node) {
                thrownExceptions.set(i, (ReferenceType) replacementNode);
                return true;
            }
        }
        for (int i = 0; i < typeParameters.size(); i++) {
            if (typeParameters.get(i) == node) {
                typeParameters.set(i, (TypeParameter) replacementNode);
                return true;
            }
        }
        return super.replace(node, replacementNode);
    
<methods>public void <init>() ,public void <init>(NodeList<com.github.javaparser.ast.expr.AnnotationExpr>) ,public void <init>(com.github.javaparser.TokenRange, NodeList<com.github.javaparser.ast.expr.AnnotationExpr>) ,public com.github.javaparser.ast.body.AnnotationDeclaration asAnnotationDeclaration() ,public com.github.javaparser.ast.body.AnnotationMemberDeclaration asAnnotationMemberDeclaration() ,public CallableDeclaration#RAW asCallableDeclaration() ,public com.github.javaparser.ast.body.ClassOrInterfaceDeclaration asClassOrInterfaceDeclaration() ,public com.github.javaparser.ast.body.CompactConstructorDeclaration asCompactConstructorDeclaration() ,public com.github.javaparser.ast.body.ConstructorDeclaration asConstructorDeclaration() ,public com.github.javaparser.ast.body.EnumConstantDeclaration asEnumConstantDeclaration() ,public com.github.javaparser.ast.body.EnumDeclaration asEnumDeclaration() ,public com.github.javaparser.ast.body.FieldDeclaration asFieldDeclaration() ,public com.github.javaparser.ast.body.InitializerDeclaration asInitializerDeclaration() ,public com.github.javaparser.ast.body.MethodDeclaration asMethodDeclaration() ,public com.github.javaparser.ast.body.RecordDeclaration asRecordDeclaration() ,public TypeDeclaration#RAW asTypeDeclaration() ,public BodyDeclaration<?> clone() ,public NodeList<com.github.javaparser.ast.expr.AnnotationExpr> getAnnotations() ,public com.github.javaparser.metamodel.BodyDeclarationMetaModel getMetaModel() ,public void ifAnnotationDeclaration(Consumer<com.github.javaparser.ast.body.AnnotationDeclaration>) ,public void ifAnnotationMemberDeclaration(Consumer<com.github.javaparser.ast.body.AnnotationMemberDeclaration>) ,public void ifCallableDeclaration(Consumer<CallableDeclaration#RAW>) ,public void ifClassOrInterfaceDeclaration(Consumer<com.github.javaparser.ast.body.ClassOrInterfaceDeclaration>) ,public void ifCompactConstructorDeclaration(Consumer<com.github.javaparser.ast.body.CompactConstructorDeclaration>) ,public void ifConstructorDeclaration(Consumer<com.github.javaparser.ast.body.ConstructorDeclaration>) ,public void ifEnumConstantDeclaration(Consumer<com.github.javaparser.ast.body.EnumConstantDeclaration>) ,public void ifEnumDeclaration(Consumer<com.github.javaparser.ast.body.EnumDeclaration>) ,public void ifFieldDeclaration(Consumer<com.github.javaparser.ast.body.FieldDeclaration>) ,public void ifInitializerDeclaration(Consumer<com.github.javaparser.ast.body.InitializerDeclaration>) ,public void ifMethodDeclaration(Consumer<com.github.javaparser.ast.body.MethodDeclaration>) ,public void ifRecordDeclaration(Consumer<com.github.javaparser.ast.body.RecordDeclaration>) ,public void ifTypeDeclaration(Consumer<TypeDeclaration#RAW>) ,public boolean isAnnotationDeclaration() ,public boolean isAnnotationMemberDeclaration() ,public boolean isCallableDeclaration() ,public boolean isClassOrInterfaceDeclaration() ,public boolean isCompactConstructorDeclaration() ,public boolean isConstructorDeclaration() ,public boolean isEnumConstantDeclaration() ,public boolean isEnumDeclaration() ,public boolean isFieldDeclaration() ,public boolean isInitializerDeclaration() ,public boolean isMethodDeclaration() ,public boolean isRecordDeclaration() ,public boolean isTypeDeclaration() ,public boolean remove(com.github.javaparser.ast.Node) ,public boolean replace(com.github.javaparser.ast.Node, com.github.javaparser.ast.Node) ,public T setAnnotations(NodeList<com.github.javaparser.ast.expr.AnnotationExpr>) ,public Optional<com.github.javaparser.ast.body.AnnotationDeclaration> toAnnotationDeclaration() ,public Optional<com.github.javaparser.ast.body.AnnotationMemberDeclaration> toAnnotationMemberDeclaration() ,public Optional<CallableDeclaration#RAW> toCallableDeclaration() ,public Optional<com.github.javaparser.ast.body.ClassOrInterfaceDeclaration> toClassOrInterfaceDeclaration() ,public Optional<com.github.javaparser.ast.body.CompactConstructorDeclaration> toCompactConstructorDeclaration() ,public Optional<com.github.javaparser.ast.body.ConstructorDeclaration> toConstructorDeclaration() ,public Optional<com.github.javaparser.ast.body.EnumConstantDeclaration> toEnumConstantDeclaration() ,public Optional<com.github.javaparser.ast.body.EnumDeclaration> toEnumDeclaration() ,public Optional<com.github.javaparser.ast.body.FieldDeclaration> toFieldDeclaration() ,public Optional<com.github.javaparser.ast.body.InitializerDeclaration> toInitializerDeclaration() ,public Optional<com.github.javaparser.ast.body.MethodDeclaration> toMethodDeclaration() ,public Optional<com.github.javaparser.ast.body.RecordDeclaration> toRecordDeclaration() ,public Optional<TypeDeclaration#RAW> toTypeDeclaration() <variables>private NodeList<com.github.javaparser.ast.expr.AnnotationExpr> annotations