为什么HashSet对象反序列化在我的代码中给出取消检查警告? | Java | IntelliJ创意|
作者:互联网
在我的代码中,当我尝试反序列化HashSet对象时,它向我发出以下警告:
Unchecked assignment:'java.util.HashSet' to'java.util.HashSet<java.lang.Integer>
Inspection info: Signals places where an unchecked warning is issued
by the compiler, for example:
void f(HashMap map) { map.put("key", "value"); }
Hint: Pass -Xlint:unchecked to javac to get more details.
这是严重警告吗?还是应该使用@SuppressWarnig?
如何消除此警告?请帮帮我,我是Java新手
我的代码是:
public class Main{
public static void main(String[] args){
HashSet<Integer> number=new HashSet<>();
Scanner input=new Scanner(System.in);
int option;
while(true){
System.out.println("1. add 2. display 3. save 4. load 5. exit");
option=input.nextInt();
if(option==1){
System.out.println("Adding : "+ number.add(1));
System.out.println("Adding : " + number.add(2));
}else if(option==2){
System.out.println("Set is : "+ number);
}else if(option==3){
try{
FileOutputStream fos=new FileOutputStream("data.bin");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(number);
oos.close();
fos.close();
}catch(IOException e){
e.getMessage();
}
}else if(option==4){
try{
FileInputStream fis=new FileInputStream("data.bin");
ObjectInputStream ois=new ObjectInputStream(fis);
number=(HashSet)ois.readObject(); // this line give me warning
}catch(IOException | ClassNotFoundException e){
e.getMessage();
}
}else if(option==5){
break;
}
}
}
}
解决方法:
没有(简便)的方式编写代码,这样您就不会收到此警告.它不是关键的,您可能会忽略它.
为什么会这样呢?
泛型是编译器想象力的伪装.您的序列化字节流仅存储您已保存的HashSet对象,而不存储< Integer>部分也不是,因为该信息在运行时不再存在.
当您存储从序列化流加载回number变量的对象时,java不知道散列集实际上是否仅包含Integer实例,并且在运行时不进行检查.例如,如果它包含字符串,就这样,然后,如果是这样,您将收到ClassCastException.
该警告特别表示:“好的,您是在断言刚刚从序列化系统获得的HashSet仅包含整数.javac没有编译时的方法来验证这一点,并且此强制转换也不会生成运行时代码来执行此操作因此,我们只是按照您的话说,所以希望您是对的!否则,ClassCastExceptions将在以后发生在怪异的地方.”
如何避免呢?
一种方法是首先为HashSet类型的变量赋值,然后遍历该变量,检查每个值是否为整数,如果为整数,则为否,如果没有,则退出此方法并显示适当的错误消息.可以强制转换集合中的单个成员,但不会收到警告..但是现在您要花额外的循环.
更好的解决方案是首先不要使用Java的内置序列化机制.它很复杂,倾向于解决安全问题,很难满足不断增长的需求(很难更改版本或从其他语言加载/写入它),它不可读,而且空间效率低.
尝试例如Jackson序列化您的对象.
标签:generic-collections,java 来源: https://codeday.me/bug/20191108/2006639.html