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];
4

2 回答 2

3

“未经检查的演员表”消息是一个警告。编译器警告您,它不能确定从Objectto的显式转换HashSet<String>可以在运行时安全地发生,这意味着如果您的类型数组Object包含除 之外的其他HashSet<String>内容,那么ClassCastException当 JVM 尝试将该对象转换为 type 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"
    ...
}

另外,考虑使用ListofSet<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"
    ...
}
于 2013-04-11T16:10:51.640 回答
3

pos[]被定义为一个Object数组。当您将其转换为HashSet<String>稍后时,Java 不知道您可以这样做。这就是未经检查的强制转换 - 编译器警告您您可能正在做一些不安全的事情。

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

于 2013-04-11T16:11:07.043 回答