这基本上是由于泛型类型擦除。在执行时,对象只会知道它是Enumeration<E>
某种类型的 - 所以它实际上E
无法检查它是否是.Enumeration<DefaultMutableTreeNode>
有关更多信息,尤其是类型擦除条目,请参阅Java 泛型常见问题解答。
编辑:我不知道为什么第一个会在没有警告的情况下成功,而第二个不会。我希望两者都会发出警告。没有我的经验,你真的不能总是逃脱@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