为什么我会收到未经检查的演员警告?

ubi*_*con 3 java

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

Enumeration<DefaultMutableTreeNode> en = (Enumeration<DefaultMutableTreeNode>)selNode.postorderEnumeration();
Run Code Online (Sandbox Code Playgroud)

但是当我使用下面的代码时,我收到一个unchecked cast警告:

Enumeration<DefaultMutableTreeNode> en = (Enumeration<DefaultMutableTreeNode>)selNode.pathFromAncestorEnumeration( this.getRootNode() );
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

Jon*_*eet 6

这主要是由于通用类型擦除.在执行时,对象只知道它是Enumeration<E>某种类型的E- 因此它实际上无法检查它是否为Enumeration<DefaultMutableTreeNode>.

有关更多信息,请参阅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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)