class Close extends Statement {

    private final String cursorName;

    /**
     * @param cursorName name of cursor to close; null implies ALL
     */
    public Close(@Nullable String cursorName) {
        this.cursorName = cursorName;
    }

    @Nullable
    public String cursorName() {
        return cursorName;
    }

    @Override
    public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
        return visitor.visitClose(this, context);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(cursorName);
    }

    @Override
    public boolean equals(Object obj) {<FILL_FUNCTION_BODY>}

    @Override
    public String toString() {
        return "Close{cursorName=" + cursorName + "}";
    }
}

        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Close other = (Close) obj;
        return Objects.equals(cursorName, other.cursorName);
    
<methods>public non-sealed void <init>() ,public R accept(AstVisitor<R,C>, C) <variables>