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

时间:2012-07-31 21:11:07

标签: java

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

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

但是当我使用以下代码时,我收到unchecked cast警告:

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

这笔交易是什么?

1 个答案:

答案 0 :(得分:6)

这主要是由于通用类型擦除。在执行时,对象只会知道某种类型Enumeration<E>的{​​{1}} - 所以它不能实际检查它是否为{&1;}。是E

有关详细信息,请参阅Java Generics FAQ,尤其是type erasure条目。

编辑:我不知道为什么第一个会在没有警告的情况下成功而第二个没有警告。我希望两个发出警告。根据我的经验,你真的无法永远离开Enumeration<DefaultMutableTreeNode> - 尽可能减少它的价值,但这是生活中不幸的事实使用Java泛型:(

编辑:我实际上从这两个中得到警告:

@SuppressWarnings("unchecked")

输出:

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);
    }
}