在实现对树型节点数据层次结构进行聚合(或类似操作)方法时,我遇到了一个问题。可以看到这里有些地方过度使用了泛型,这并不令我满意,因此我的问题是:是否有更好的方法来实现它(可能避免在向下的聚合方法中从对象进行强制类型转换)?
目前的情况(省略了无关细节):
public interface AggregableTreeData<T extends AggregableTreeData> {
void aggregate(T from);
}
public abstract class FruitTreeData<T extends FruitTreeData<?>>
implements AggregableTreeData<T> {
private BigDecimal size = BigDecimal.ZERO;
@Override
public void aggregate(T from) {
this.size = this.size.add(from.size);
}
}
public class OrangeTreeData<T extends OrangeTreeData<?>>
extends FruitTreeData<T> {
private boolean ripened = false;
@Override
public void aggregate(T from) {
this.ripened = this.ripened || from.ripened;
}
}
此外,我还有一个执行树形数据聚合的方法,看起来像这样:
//child.getData() and node.getData() is of type <T extends AggregableTreeData<T>>
void aggregateNode(TreeNode node) {
for (TreeNode child : node.getChildren()) {
aggregateNode(child);
node.getData().aggregate(child.getData());
}
}