Java中“未经检查的强制转换”警告的说明

时间:2013-04-11 16:07:25

标签: java exception casting

我只是一个初学者,我想要一个好心灵来帮助我;)我得到了这个方法并且就行了:

( (HashSet<String>) pos[targetPos]).add(word);

它给了我一个例外

    (Unchecked cast from Object to HashSet<String>)

我尝试将Object [pos]更改为String [pos]更具体,但它在这一行上给我一个错误:pos[targetPos] = new HashSet<String>();

Type mismatch: cannot convert from HashSet<String> to String

这是方法:

public void add(String word, Object[] root){

    Object[] pos = root;
    int wordIndex = 0;
    int targetPos;

    if(word.length()>=3){
        for(int i = 1; i <=3; i++){
            targetPos = word.charAt(wordIndex) -'a'; //convert a letter into index eg a==0
            if(i==3){
                if(pos[targetPos]==null){
                    pos[targetPos] = new HashSet<String>();
                }
                ( (HashSet<String>) pos[targetPos]).add(word);
                //System.out.println(Arrays.toString(pos));
                break;

            }//end if outer if
            else{
                if(pos[targetPos]==null){
                    pos[targetPos] = new Object[28];
                }
                wordIndex++;
                pos =  (Object[]) pos[targetPos];
            }
        }//end of for
    }

}

根是

 Object[] root = new Object[28];

2 个答案:

答案 0 :(得分:3)

“未经检查的演员”消息是一个警告。编译器警告您无法确定从ObjectHashSet<String>的显式强制转换是否可以在运行时安全地发生,这意味着如果类型Object的数组包含,则可能某些其他而不是HashSet<String>,当JVM尝试将该对象强制转换为ClassCastException类型时,您将在运行时获得HashSet<String>。基本上,编译器会事先警告您,您正在做一些可能不安全的事情,以后可能会出现问题。

简单地使用数组的原始对象不是一个好习惯。如果你要确定数组只包含HashSet<String>个对象,那么你应该这样输入它(即Set<String>[];使用接口代替你的类型的具体实现因为那时你可以在需要时切换实现)。唯一一次你应该做一个显式的强制转换是当你绝对确定你正在投射的对象绝对是你所投射的类型。例如,如果您有一个实现接口的对象,并且还假设您在某个类中最明确地使用该接口的特定具体实现。在这种情况下,可以将它从该接口转换为具体类型。

您的方法应如下所示:

public void add(String word, Set<String>[] root){

    Set<String>[] pos = root; //You probably don't even need this since you have "root"
    ...
}

另外,请考虑使用List Set<String>而不是数组:

public void add(String word, List<Set<String>> root){

    List<Set<String>> pos = root; //You probably don't even need this since you have "root"
    ...
}

答案 1 :(得分:3)

pos[]被定义为Object数组。当您将其转换为HashSet<String>之后,Java不知道您可以这样做。这就是未经检查的演员阵容 - 编译器警告你,你可能会做一些不安全的事情。

您可以通过将pos的类型更改为HashSet<String>[]来消除警告。