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

funde 发布于 2019-03-09 casting 最后更新 2019-03-09 14:34 0 浏览

即时通讯只是一个初学者,我想要一个好的灵魂来帮助我;)我得到了这个方法,并在线上:

( (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];
已邀请:

afuga

赞同来自:

“未经检查的演员”消息是一个警告。编译器警告你,它不能确保从Object的显式的HashSet<String>在运行期间可以安全地发生,这意味着它可能是,如果你的类型Object的数组包含除HashSet<String>其他的东西,你会在运行时得到ClassCastException当JVM尝试将该对象强制转换为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"
    ...
}
另外,请考虑使用Set<String>List而不是数组:
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"
    ...
}

west

赞同来自:

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