gpt4 book ai didi

java - 展平通用 Java 树

转载 作者:行者123 更新时间:2023-11-30 04:58:35 25 4
gpt4 key购买 nike

我有一个可以有 parent 和 child 的模型界面

public interface HierarchyAware<T extends HierarchyAware<T>> {

List<T> getChildren();

T getParent();

void addChild(T child);

}

我有一个实用方法,它采用平面列表并构建一棵树:

<T extends HierarchyAware<? super T>> List<T> buildTree(List<T> flatElements);

它工作得很好,所以不需要发布方法主体。

我还有一种将树展平为普通列表的方法:

  public static List<? extends HierarchyAware<?>> flattenTree(List<? extends HierarchyAware<?>> treeElements) {
List<HierarchyAware<?>> flatList = new ArrayList<HierarchyAware<?>>();
for (HierarchyAware<?> t : treeElements) {
flatList.add(t);
if (t.getChildren() != null) {
flatList.addAll(flattenTree(t.getChildren()));
}
}
return flatList;
}

但我真的不喜欢它的签名,并且想让它更具体。所以我这样编码:

  @SuppressWarnings("unchecked")
public static <T extends HierarchyAware<? super T>> List<T> flattenTree(List<T> treeElements) {
List<T> flatList = new ArrayList<T>();
for (T t : treeElements) {
flatList.add(t);
if (t.getChildren() != null) {
flatList.addAll((List<? extends T>) flattenTree(t.getChildren()));
}
}
return flatList;
}

签名对我来说是完美的,但我不喜欢抑制警告。最大的问题是 Eclipse 编译器发现这段代码合法,但 javac 给了我:

[javac] C:\somepath\TreeUtil.java:112: <T>flattenTree(java.util.List<T>) in somepackage.TreeUtil cannot be applied to (java.util.List<capture#687 of ? super T>)
[javac] flatList.addAll((List<? extends T>) flattenTree(t.getChildren()));
[javac] ^

为什么两个编译器的行为不同?我应该如何重写这个方法,这样它就会出错并且最好没有警告?

最佳答案

首先似乎存在一个概念问题:

了解某些基类的层次结构可以防止在编译时生成派生类的子级 (getChildren)。因此,安全地获取派生类的 List 始终是不安全的。

也就是说,如果您的意思不是 A 类只有 A 类的子级,依此类推。这是可行的。

    public static <T extends HierarchyAware<T>> List<T> flattenTreeX(List<T> treeElements) {
List<T> flatList = new ArrayList<T>();
for (T t : treeElements) {
flatList.add(t);
if (t.getChildren() != null) {
flatList.addAll((List<? extends T>) flattenTreeX(t.getChildren()));
}
}
return flatList;

关于java - 展平通用 Java 树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7689937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com