2012-07-31 97 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

相關問題