“解释”;“未经检查的铸件”;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"
...
}