Java 为什么我会收到未经检查的演员警告?
在JTree中,我使用此代码,没有收到任何警告:Java 为什么我会收到未经检查的演员警告?,java,Java,在JTree中,我使用此代码,没有收到任何警告: Enumeration<DefaultMutableTreeNode> en = (Enumeration<DefaultMutableTreeNode>)selNode.postorderEnumeration(); 这是怎么回事?基本上是由于泛型类型擦除。在执行时,对象只知道它是某种类型的E的枚举——因此它实际上无法检查它是否是枚举 有关更多信息,尤其是条目,请参见 编辑:我不知道为什么第一个会在没有警告的情况下成功
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搜索中总是首先弹出的一个。@typokniggthis.getRootNode()的类型是什么
?但为什么他只在第二种情况下得到强制类型转换警告呢?DefaultMutableTreeNode
returnEnumeration
和notEnumeration
?唯一可疑的是在第一种情况下没有警告。如果链接的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