我有一个看起来像树的大型数据结构。我有一个根类 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);
这将返回一个 vector ,其中填充了用传入的类指定的种类和类的值标记的所有子项。返回的 vector 将始终包含传入的类的元素。问题是我正在尝试实现正确的类型安全,我不清楚如何为此使用 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 方法来实现这种具有完全类型安全性的机制——并且我假设消除了类参数。任何帮助将不胜感激。
最佳答案
修复 getChildren 声明的方法是:
public <T extends TreeElement> Vector<T> getChildren(String string, Class<T> nodeType)
这将使编译器在您使用时不会出现类型警告。
该方法的实现中仍然会有一些警告,因为泛型是编译时功能,并且您提供了运行时类型参数,但警告至少会在该方法内部被隔离。
关于java - 如何在多态树中使用Java泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14904978/