首页 > 解决方案 > 对可序列化对象使用泛化

问题描述

假设您有以下代码,您将收到有关原始类型的警告。

public class Test implements Serializable{
    
    private static final long serialVersionUID = -793775208204855910L;
    private List dataList = new ArrayList<>();
    public void add(Object data) {
        dataList.add(data);
    }
}

因此,您更改它并将 dataList 声明为对象列表。您不会再收到任何警告,因为它不再使用原始类型。但是后来 Sonar 抱怨因为你没有使用序列化的对象列表,因为你有一个序列化的类。

public class test implements Serializable{
    
    private static final long serialVersionUID = -793775208204855910L;
    private List<Object> dataList = new ArrayList<>();
    public void add(Object data) {
        dataList.add(data);
    }
}

因此,您更改了 List 声明,以便对象实现 Serializable,但是您不能再将对象添加到列表中。

public class test implements Serializable{
    
    private static final long serialVersionUID = -793775208204855910L;
    private List<? extends Serializable> dataList = new ArrayList<>();
    public void add(Object data) {
        dataList.add(data); //<--Doesn't compile, gives an error
    }
}

有没有其他方法可以将泛化与序列化对象一起使用,不会在 Java 和 Sonar 中生成警告或错误?

标签: javaserializationsonarlint

解决方案


您的问题是 Object 本身不可序列化。所以尝试将 Method 参数声明为 Serializable 或它的实现。解决方案 1:摆脱 ? 并直接使用可序列化:

private List<Serializable> dataList = new ArrayList<>();
public void add(Serializable data) {
  dataList.add(data);
}

解决方案2:如果你想保留?尝试:

public <T extends Serializable> void add(T data) {
  dataList.add(data);
}

无论如何,如果您将其声明为可序列化列表,则需要使用可序列化而不是任何对象来填充它。


推荐阅读