2012-07-31 99 views
3

在JTree我用这个代码,我没有收到任何警告:为什么我会收到未经检查的投射警告?

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

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

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

请告诉我交易?

+0

什么返回类型的那些方法 – SLaks 2012-07-31 21:13:07

+0

什么是this.getRootNode() – GreenMatt 2012-07-31 21:14:38

+0

[Both](http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/tree/DefaultMutableTreeNode.html#preorderEnumeration())返回[Enumeration](http:// docs .oracle.com/javase/1.4.2/docs/api/java/util/Enumeration.html) – ubiquibacon 2012-07-31 21:15:08

回答

6

这基本上是由于泛型擦除。在执行时,对象将只知道它是Enumeration<E>某些类型E - 因此它不能实际上检查它是否是Enumeration<DefaultMutableTreeNode>

查看Java Generics FAQ了解更多信息,尤其是type erasure条目。

编辑:我不知道为什么第一个会成功没有警告,第二个不是。我希望给予警告。你真的不能总是跑不掉没有在我的经验@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 
+0

但是他为什么只在第二种情况下才会收到警告? 'DefaultMutableTreeNode'的两个API都返回'Enumeration'而不是'Enumeration ''? – Cratylus 2012-07-31 21:21:03

+1

唯一可疑的是在第一种情况下没有警告。如果链接的Javadoc是相关的,那么两行**都应该产生该警告。该API甚至不知道泛型,因此所有的演员都是从原始类型转换为参数化演员。但是,OP链接到J2SE 1.4版本,所以Javadoc可能是错误的。 – 2012-07-31 21:23:46

+0

是的,那也是我的问题。我被告知你永远不需要'@SuppressWarnings(“unchecked”)',我相信我在我的问题中编写了代码,因此不需要注释。 – ubiquibacon 2012-07-31 21:26:03

相关问题