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

Java 为什么我会收到未经检查的演员警告?,java,Java,在JTree中,我使用此代码,没有收到任何警告: Enumeration<DefaultMutableTreeNode> en = (Enumeration<DefaultMutableTreeNode>)selNode.postorderEnumeration(); 这是怎么回事?基本上是由于泛型类型擦除。在执行时,对象只知道它是某种类型的E的枚举——因此它实际上无法检查它是否是枚举 有关更多信息,尤其是条目,请参见 编辑:我不知道为什么第一个会在没有警告的情况下成功

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

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

这是怎么回事?

基本上是由于泛型类型擦除。在执行时,对象只知道它是某种类型的
E
枚举
——因此它实际上无法检查它是否是
枚举

有关更多信息,尤其是条目,请参见

编辑:我不知道为什么第一个会在没有警告的情况下成功,而第二个不会成功。我希望双方都能发出警告。根据我的经验,如果没有
@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);
    }
}
import java.util.*;
导入javax.swing.tree.*;
公开课考试{
公共静态void main(字符串[]args){
DefaultMutableTreeNode=null;
枚举en1=
(枚举)node.postorderEnumeration();
枚举en2=
(枚举)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
c:\Users\Jon\Test>javac-Xlint Test.java
Test.java:8:警告:[未选中]未选中强制转换
枚举en1=(枚举)节点。postorderEnumeration();
^
必需:枚举
发现:枚举
Test.java:9:警告:[未选中]未选中强制转换
枚举en2=(枚举)节点.pathFromAncestorEnumeration(null);
^
必需:枚举
发现:枚举
2警告

这些方法的返回类型是什么?返回一个
getRootNode()
只返回一个。我提供的链接是指向Java 1.4.2 API的,但我的Java版本是1.6.33…1.4.2只是在Google搜索中总是首先弹出的一个。@typoknigg
this.getRootNode()的类型是什么
?但为什么他只在第二种情况下得到强制类型转换警告呢?
DefaultMutableTreeNode
return
Enumeration
和not
Enumeration
?唯一可疑的是在第一种情况下没有警告。如果链接的Javadoc是相关的,那么这两行都应该产生警告。该API甚至不知道泛型,因此所有类型转换都是从原始类型转换为参数化类型。但是,OP链接到J2SE 1.4版本,因此Javadoc可能是错误的。是的,这也是我的问题。有人告诉我,您永远不需要
@SuppressWarnings(“未选中”)
,我相信我在问题中编写了代码,这样就不需要注释了。@typoknig:请参阅我的编辑-我在两次调用中都收到了警告。您能否提供一个类似的简短但完整的程序,只在第二次调用时显示警告?
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