对可序列化对象使用泛化

Using Generialization with Serializable Objects

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

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 会抱怨,因为你没有使用序列化的对象列表,因为你有一个序列化的 Class.

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 声明,以便对象实现可序列化,但您无法再将对象添加到列表中。

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 中生成警告或错误?

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

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

方案二: 如果你喜欢保留 th ?尝试:

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

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