0

我有一个看起来像树的大型数据结构。我有一个实现所有树行为、链接、取消链接、导航等的根类 TreeElement。树中的实际节点将是 TreeElement 类的专门子类。给定的父节点将有不止一种类型的子节点。这是一个示例树:

NodeTypeA
+ NodeTypeB
  + NodeTypeC
  + NodeTypeC
+ NodeTypeB
  + NodeTypeC
+ NodeTypeD
  + NodeTypeE

如您所见,NodeTypeA 具有 B 和 D 类型(可能还有其他类型)的孩子,而 NodeTypeB 具有 C 类型(可能还有其他)的孩子。NodeTypeD 具有 E 类型的子级(可能还有其他)。所有这些都是 TreeElement 的子类。专门的子类对他们被允许拥有的孩子的种类有一些了解。

基本类型 TreeElement 有一个方法

Vector getChildren(String kind, Class nodeType);

这将返回一个向量,其中填充了所有用 kind 的值标记的子项,以及用传入的类指定的类。返回的向量将始终包含传入的类的元素。问题是我正在尝试实现正确的一种类型安全,我不清楚如何为此使用 java 的动态类型功能。

在 NodeTypeA 类中,我想要一个这样的方法来获取 NodeTypeB 的子级:

Vector<NodeTypeB> getSpecialChildren() {
    Vector<NodeTypeB> vb = getChildren("special", NodeTypeB.class);
    return vb;
}

当我编写上述内容时,我在 Eclipse 中收到需要类型转换的警告。所以我可以添加一个类型转换:

Vector<NodeTypeB> getSpecialChildren() {
    Vector<NodeTypeB> vb = (Vector<NodeTypeB>) getChildren("special", NodeTypeB.class);
    return vb;
}

但是,我也有 Eclipse 的“删除不必要的演员表”的功能,这个功能删除了这个演员表。这似乎有点奇怪,Eclipse 认为它没有必要,但如果它不存在就会发出警告。但这只是一个烦恼。

我真正想做的是使用Java的动态类型机制(这是'有界类型参数'???)来使这项工作正常进行。我根本不知道如何在 TreeElement 类中声明 getChildren 方法以实现这种具有完全类型安全性的机制——我假设消除了类参数。任何帮助,将不胜感激。

4

2 回答 2

1

修复 getChildren 声明的方法是:

public <T extends TreeElement> Vector<T> getChildren(String string, Class<T> nodeType)

这将使编译器在您使用时不会出现类型警告。

该方法的实现仍然会有一些警告,因为泛型是一个编译时特性,并且您提供了一个运行时类型参数,但这些警告至少会在该方法中被隔离。

于 2013-02-15T23:25:47.337 回答
0

您应该考虑实现嵌套集树或邻接树。我为嵌套集树做了一些类,这些类使用非常有用且易于重新利用的泛型。

它的核心看起来像:

public class NestedSetTree<? extends NestedSetTree<T>> 

那么节点就是T。你可以实现所有的基础,比如getParent()、getAncestorOfType(NodeType type)等。

于 2013-02-15T23:24:14.373 回答