对可序列化对象使用泛化
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);
}
无论如何,如果您将它声明为可序列化列表,您需要用可序列化而不是任何对象来填充它。
假设您有以下代码,您将收到有关原始类型的警告。
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);
}
无论如何,如果您将它声明为可序列化列表,您需要用可序列化而不是任何对象来填充它。