Java继承参数化Node<Integer>类添加sum方法无需重定义left/right的实现方案
Java二叉树Integer节点新增sum方法的可行方案
以下是不需要重定义父类left、right属性的两种实现思路,按是否可修改原Node<T>类代码区分:
不可修改原Node<T>类代码
方案1:静态工具方法(推荐,无类型安全问题)
直接实现独立的工具类方法处理求和逻辑,无需继承父类,调用简单:
public class NodeUtils { public static int sum(Node<Integer> node) { if (node == null) { return 0; } int sum = node.info; sum += sum(node.left); sum += sum(node.right); return sum; } }
调用方式为NodeUtils.sum(目标节点),逻辑和你预期的成员方法完全一致。
方案2:子类强转(适合必须用成员方法调用的场景)
只要你构建二叉树时所有节点的left、right都赋值为NodeOfIntegers实例,可在子类sum方法中做强转:
首先修正你的子类构造方法写法:
public class NodeOfIntegers extends Node<Integer> { public NodeOfIntegers(Integer info) { super(info); } public int sum() { int sum = this.info; if (this.left != null) { sum += ((NodeOfIntegers) this.left).sum(); } if (this.right != null) { sum += ((NodeOfIntegers) this.right).sum(); } return sum; } }
注意:该方案要求树中所有节点都是NodeOfIntegers实例,否则会抛出ClassCastException,建议重写父类的left、right赋值方法限制入参类型,避免运行时报错。
可修改原Node<T>类代码
可以将父类改造为自限定泛型结构,无需重定义left、right属性,即可让属性类型自动匹配子类:
// 改造后的父类 public class Node<T, N extends Node<T, N>> { T info; N left; N right; public Node(T info) { this.info = info; } }
子类实现如下,可直接调用left、right的sum方法:
public class NodeOfIntegers extends Node<Integer, NodeOfIntegers> { public NodeOfIntegers(Integer info) { super(info); } public int sum() { int sum = this.info; if (left != null) sum += left.sum(); if (right != null) sum += right.sum(); return sum; } }
该方案完全类型安全,无需强制类型转换。
内容的提问来源于stack exchange,提问作者patmuir
相关产品推荐
相关产品推荐

