我在 Java 中使用泛型有一个奇怪的问题。泛型对我来说很新,但我想我了解基础知识。
请看一下这段代码:
private void drawQuadtreeBoxes_helper(QuadTree<?> node) {
if (node == null)
return;
Vector3 min = node.bbox.min;
Vector3 max = node.bbox.max;
// Draw the boxes (...)
if (node.hasChildren()) {
Array<QuadTree<?>> children = node.getChildren(); // ERROR HERE
for (QuadTree<?> child : children) {
drawQuadtreeBoxes_helper(child);
}
}
}
因为存储在四叉树结构中的对象类型与此方法无关,所以我使用通配符作为方法签名,以便此方法可以应用于各种四叉树。
getChildren() 方法返回节点的四个子节点,存储在名为 Array 的集合类(Array的实现)中。我确信 getChildren() 的返回类型确实是Array<QuadTree<?>>
(甚至 Eclipse 在工具提示中也这么说),但我仍然在这一行得到一个错误,告诉我:
cannot convert from Array<QuadTree<capture#6-of ?>> to Array<QuadTree<?>>
有趣的部分来了:当我向 Eclipse 询问如何解决这个问题的建议时,这是建议之一:
Change type of 'children' to 'Array<QuadTree<?>>'
但是已经是这种类型了!它变得更好了:当我点击这个建议时,Eclipse 将这一行更改为:
Array<?> children = node.getChildren();
当然,这会破坏以下所有代码。
这到底是怎么回事?有人可以启发我吗?