gpt4 book ai didi

java - 为什么 HashSet 对象反序列化在我的代码中给出取消选中警告? | java |智能理念 |

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:31:23 24 4
gpt4 key购买 nike

在我的代码中,当我尝试反序列化 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<?> 的变量,然后遍历它,检查每个值是否为整数,如果是,则将其放入 number ,如果没有退出方法并显示正确的错误消息。可以对集合中的单个成员进行强制转换,并且不会收到警告。但现在您正在花费一个额外的循环。

一个更好的解决方案是首先不使用 java 的内置序列化机制。它很复杂,往往会导致安全问题,很难处理不断扩展的需求(很难更改版本或从其他语言加载/编写它),它不是人类可读的,而且空间效率不高。

例如尝试Jackson序列化您的对象。

关于java - 为什么 HashSet 对象反序列化在我的代码中给出取消选中警告? | java |智能理念 |,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54607424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com