我在 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 (implementation of 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();
当然,这会破坏下面所有的代码。
这到底是怎么回事?请哪位大侠指教一下?
最佳答案
问题是方法不知道它是相同 QuadTree<?>
(?
可以引用同一调用中的不同 类型)。
解决方案是“键入”方法,该方法锁定在QuadTree<?>
。 (因此 ?
)在整个方法中都是相同类型。
private <T extends QuadTree<?>> void drawQuadtreeBoxes_helper(T node) {
if (node == null)
return;
Vector3 min = node.bbox.min;
Vector3 max = node.bbox.max;
// Draw the boxes (...)
if (node.hasChildren()) {
Array<T> children = node.getChildren(); // ERROR HERE
for (T child : children) {
drawQuadtreeBoxes_helper(child);
}
}
}
?
仍然表示“任何东西”,但现在相同“任何东西”。
关于java - "Type mismatch"将 Java 泛型与通配符一起使用时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11367979/