【发布时间】:2013-12-09 08:00:10
【问题描述】:
当我尝试从 Object 强制转换为泛型类型时收到警告。
由于我的内部 Node 类上的底层数据结构是一个数组,因此我无法将 Node 设为泛型,因为我无法创建泛型数组,因此我的 val 参数必须是一个 Object。
是否有任何解决方法或更好的方法?我可以直接取消警告,但我不确定这是否会产生我应该关注的后果。
我也在制作不同的树来实现 MyTreeI 并且都将具有不同的节点结构(所以我不能只制作一个实际的节点类(这甚至可以工作吗?我不知道..也许))
此处为示例代码:
public class MyTree<E> implements MyTreeI<E> {
private Node root; // root of tree
private static class Node {
private Object val;
private Node[] children = new Node[2];
}
public MyTree() {
}
@Override
public E get(String key) {
Node x = getNode(key); // helper function, assume it returns node in question
return (E) x.val;
}
}
【问题讨论】:
-
为什么不能让 Node 使用
E作为val的类型,而子节点使用List<Node>,而不是数组? -
我无法将 E 设为 val 的类型,因为我无法从静态引用中引用非静态类型...至于将其设为 List - 我有很多其他已经利用它是一个数组这一事实的代码 - 我可以将它全部更改为使用列表,但我更倾向于保持原样并抑制警告而不是重做所有代码 - 或者是一个坏主意?
-
Node 类也必须是通用的:
private static class Node<E>,并且根的类型应该是Node<E>,以及x。getNode()应该返回一个Node<E>等。你当然可以使用一个数组,但是你会收到类型安全警告。 -
这样做对我来说并不理想,因为我正在实现一个不需要通用返回的接口;我创建了不同的树,并非所有节点的格式都相同,所以我只想返回一个 Element 而不是 Node
-
哦,这太愚蠢了,你的意思是我的辅助函数。我明白了——我仍然宁愿只在万不得已的情况下才这样做,因为我必须修改相当多的代码块,所以如果有任何方法我可以用一个很棒的数组来做到这一点,但如果没有,我可能只是去列表路线
标签: java generics casting inner-classes