4

JTree では、次のコードを使用していますが、警告は表示されません。

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

しかし、次のコードを使用すると、unchecked cast警告が表示されます。

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

どうしたんだ?

4

1 に答える 1

6

これは基本的にジェネリック型の消去によるものです。実行時に、オブジェクトはそれがEnumeration<E>for 型であることしか認識しEないため、実際Enumeration<DefaultMutableTreeNode>.

詳細、特に型消去エントリについては、 Java Generics FAQを参照してください。

編集:最初の警告なしで成功し、2番目の警告なしで成功する理由がわかりません。どちらも警告を出すと思います。私の経験では、それなしでは本当にうまくいくとは限りませ@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
于 2012-07-31T21:15:02.530 に答える