“解释”;“未经检查的铸件”;Java中的警告

“解释”;“未经检查的铸件”;Java中的警告,java,exception,casting,Java,Exception,Casting,我只是一个初学者,我希望有一个好的灵魂来帮助我;)我得到了这个方法,在网上: ( (HashSet<String>) pos[targetPos]).add(word); “unchecked cast”消息是一个警告。编译器警告您,它无法确保从对象到哈希集的显式转换在运行时可以安全进行,这意味着如果类型为对象的数组包含的内容不是哈希集,则有可能,当JVM试图将该对象强制转换为类型HashSet时,您将在运行时得到一个ClassCastException。从本质上说,编译器是在事先

我只是一个初学者,我希望有一个好的灵魂来帮助我;)我得到了这个方法,在网上:

( (HashSet<String>) pos[targetPos]).add(word);
“unchecked cast”消息是一个警告。编译器警告您,它无法确保从
对象
哈希集
的显式转换在运行时可以安全进行,这意味着如果类型为
对象
的数组包含的内容不是
哈希集
,则有可能,当JVM试图将该对象强制转换为类型
HashSet
时,您将在运行时得到一个
ClassCastException
。从本质上说,编译器是在事先警告您,您正在做一些可能不安全的事情,这可能是以后问题的根源

简单地使用数组的原始对象不是一个好的实践。如果要确保数组只包含
HashSet
对象,那么您可能应该这样键入它(即
Set[]
;使用接口而不是类型的具体实现,因为这样您就可以在需要时切换实现)。您应该执行显式强制转换的唯一时间是,您可以绝对确定要强制转换的对象是您要强制转换的对象的类型。例如,如果您有一个实现接口的对象,并且还假设您在某个类中,该类肯定正在使用该接口的特定具体实现。在这种情况下,可以将其从该界面浇筑到混凝土类型中

您的方法应如下所示:

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

    Set<String>[] pos = root; //You probably don't even need this since you have "root"
    ...
}
“unchecked cast”消息是一个警告。编译器警告您,它无法确保从
对象
哈希集
的显式转换在运行时可以安全进行,这意味着如果类型为
对象
的数组包含的内容不是
哈希集
,则有可能,当JVM试图将该对象强制转换为类型
HashSet
时,您将在运行时得到一个
ClassCastException
。从本质上说,编译器是在事先警告您,您正在做一些可能不安全的事情,这可能是以后问题的根源

简单地使用数组的原始对象不是一个好的实践。如果要确保数组只包含
HashSet
对象,那么您可能应该这样键入它(即
Set[]
;使用接口而不是类型的具体实现,因为这样您就可以在需要时切换实现)。您应该执行显式强制转换的唯一时间是,您可以绝对确定要强制转换的对象是您要强制转换的对象的类型。例如,如果您有一个实现接口的对象,并且还假设您在某个类中,该类肯定正在使用该接口的特定具体实现。在这种情况下,可以将其从该界面浇筑到混凝土类型中

您的方法应如下所示:

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

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

pos[]
被定义为
对象
数组。当您稍后将其转换为
HashSet
时,Java不知道您可以这样做。这就是未经检查的强制转换——编译器警告您可能正在执行不安全的操作


您可以通过将
pos
的类型更改为
HashSet[]

pos[]
定义为
对象
数组来消除警告。当您稍后将其转换为
HashSet
时,Java不知道您可以这样做。这就是未经检查的强制转换——编译器警告您可能正在执行不安全的操作


您可以通过将
pos
的类型更改为
HashSet[]

“Unchecked cast from Object to HashSet”
听起来像是编译时警告,而不是异常。你能澄清一下吗?你可能想改变你的头衔;未经检查的异常意味着完全不同的东西。
“未经检查的从对象到哈希集的强制转换”
听起来像是编译时警告,而不是异常。你能澄清一下吗?你可能想改变你的头衔;未经检查的异常意味着完全不同的内容。如果我将其定义为字符串数组,则表示无法从HashSet转换为String@user1747976字符串数组不同于字符串哈希集数组您不需要字符串数组,您需要一个HashSet数组。如果我将其定义为字符串数组,它会说无法从HashSet转换为String@user1747976字符串数组不同于字符串的哈希集数组。如果不需要字符串数组,则需要哈希集数组。@user1747976查看我的更新答案。您基本上应该使用您想要的实际类型,即,
Set
。我这样做了((Set)pos[targetPos])。添加(word),它仍然会给我一个从对象到对象的未选中强制转换的警告Set@user1747976不,你根本不应该选演员。将方法的参数类型更改为
Set[]
List
。我还需要将pos[targetPos]=new Object[28]更改为pos[targetPos]=new Set[28]???然后我有一个错误:无法从集合[]转换为Set@user1747976您是否试图维护
集合
的集合?基本上,您是否正在尝试使用多个
Set
实例?据我所知,您基本上有一个
集合的数组。如果是这种情况,那么您需要
pos[targetPos]=newhashset()假设
pos
类型为
Set[]
@user1747976查看我的更新答案。您基本上应该使用您想要的实际类型,即,
Set
。我这样做了((Set)pos[targetPos])。添加(word),它仍然会给我一个从对象到对象的未选中强制转换的警告Set@user1747976不,你根本不应该选演员。更改的参数类型
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];
public void add(String word, Set<String>[] root){

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