java - 如何在多态树中使用Java泛型类型参数

标签 java dynamic types bounded-types

我有一个看起来像树的大型数据结构。我有一个根类 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/

相关文章:

java - 使用正则表达式为 ArrayList 中的变量赋值

java - Spring - 删除验证错误?

html - 左侧 div 侧边栏动态向下延伸到底部

java - java中如何获取类的字段名

go - 我可以在 Golang 中将变量类型与 .(type) 进行比较吗?

java - 将其他应用程序的图像共享到我的应用程序

java - 将一个 json 属性映射到 java 中的两个不同字段 (jackson)

c - 尝试使用 malloc 时出现段错误

haskell - 为什么 6/length [1, 2, 3] 在 Haskell 中不起作用

sql - ORDER BY 取决于列类型