在JTree中,我使用以下代码,并且没有收到任何警告:
Enumeration<DefaultMutableTreeNode> en = (Enumeration<DefaultMutableTreeNode>)selNode.postorderEnumeration();
但是当我使用下面的代码时,我得到了一个unchecked cast
警告:
Enumeration<DefaultMutableTreeNode> en = (Enumeration<DefaultMutableTreeNode>)selNode.pathFromAncestorEnumeration( this.getRootNode() );
这是怎么回事?
发布于 2012-07-31 21:15:03
这基本上是由于泛型类型擦除造成的。在执行时,对象只知道它是某个类型E
的Enumeration<E>
-所以它不能实际检查它是不是一个Enumeration<DefaultMutableTreeNode>
。
有关更多信息,特别是type erasure条目,请参阅Java Generics FAQ。
编辑:我不知道为什么第一个会在没有警告的情况下成功,第二个不会。我希望两者都能给出警告。在我的经验中,你真的不能总是没有@SuppressWarnings("unchecked")
-在你能做到的地方最小化它是值得的,但这是使用Java泛型的一个不幸的事实:
编辑:实际上我从这两个地方都得到了警告:
import java.util.*;
import javax.swing.tree.*;
public class Test {
public static void main(String[] args) {
DefaultMutableTreeNode node = null;
Enumeration<DefaultMutableTreeNode> en1 =
(Enumeration<DefaultMutableTreeNode>)node.postorderEnumeration();
Enumeration<DefaultMutableTreeNode> en2 =
(Enumeration<DefaultMutableTreeNode>)node.pathFromAncestorEnumeration(null);
}
}
输出:
c:\Users\Jon\Test>javac -Xlint Test.java
Test.java:8: warning: [unchecked] unchecked cast
Enumeration<DefaultMutableTreeNode> en1 = (Enumeration<DefaultMutableTre
eNode>)node.postorderEnumeration();
^
required: Enumeration<DefaultMutableTreeNode>
found: Enumeration
Test.java:9: warning: [unchecked] unchecked cast
Enumeration<DefaultMutableTreeNode> en2 = (Enumeration<DefaultMutableTre
eNode>)node.pathFromAncestorEnumeration(null);
^
required: Enumeration<DefaultMutableTreeNode>
found: Enumeration
2 warnings
https://stackoverflow.com/questions/11749065
复制相似问题