java - 对可序列化对象使用泛化
问题描述
假设您有以下代码,您将收到有关原始类型的警告。
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 中生成警告或错误?
解决方案
您的问题是 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);
}
无论如何,如果您将其声明为可序列化列表,则需要使用可序列化而不是任何对象来填充它。
推荐阅读
- c# - Blazor with MatBlazor 在 AuthorizeView 中使用 MatTableRow 导致相同的参数名称错误
- excel - Excel,Power Query:根据日期从源工作簿中提取列
- javascript - 参数字典包含方法“System.Web.Mvc.JsonResult”的不可空类型“System.Int32”的参数“wantedids”的空条目
- java - 如何获取我的计算机的 IP 地址而不是虚拟盒适配器
- php - 如果购物车在 WooCommerce 3+ 的购物车页面上清空,则重定向到商店
- python - 在 Python 中将布尔值转换为列表中的字符串
- android - 究竟什么是视图模型?
- python - 如果未达到声明
- scala - 在 scala 中,如何使类型类适用于 Aux 模式?- 第2部分
- reporting-services - SSRS 2008:在布尔值上执行数据集