4

在 JTree 中,我使用此代码,但没有收到任何警告:

Enumeration<DefaultMutableTreeNode> en = (Enumeration<DefaultMutableTreeNode>)selNode.postorderEnumeration();

但是当我使用以下代码时,会收到unchecked cast警告:

Enumeration<DefaultMutableTreeNode> en = (Enumeration<DefaultMutableTreeNode>)selNode.pathFromAncestorEnumeration( this.getRootNode() );

这是怎么回事?

4

1 回答 1

6

这基本上是由于泛型类型擦除。在执行时,对象只会知道它是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
于 2012-07-31T21:15:02.530 回答