class RecursiveAssertionNode {
  public final Object value;
  public final String name;
  public final Class<?> type;

  public RecursiveAssertionNode(Object value, String name, Class<?> type) {
    this.value = value;
    this.name = name;
    this.type = type;
  }

  @Override
  public String toString() {
    return String.format("RecursiveAssertionNode[value=%s, name=%s, type=%s]", this.value, this.name, this.type);
  }

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

  @Override
  public int hashCode() {
    return Objects.hash(value, name, type);
  }
}

    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    RecursiveAssertionNode that = (RecursiveAssertionNode) o;
    return Objects.equals(value, that.value) && Objects.equals(name, that.name) && Objects.equals(type, that.type);
  
<no_super_class>