假设您有以下代码,则会收到有关原始类型的警告。
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声明,以使对象实现序列化,但是您就不能再将Objects添加到列表中。
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
}
}
我还有其他方法可以将Generalization与序列化对象一起使用,而不会在Java和Sonar中生成警告或错误吗?
答案 0 :(得分:3)
您的问题是,对象本身不可序列化。因此,尝试将Method参数声明为Serializable或它的实现。 解决方案1: 摆脱?并直接使用Serializable:
$query_args = array(
'status' => 'publish',
'limit' => -1,
);
foreach( wc_get_products($query_args) as $product ){
foreach( $product->get_attributes() as $taxonomy => $attribute ){
$attribute_name = get_taxonomy( $taxonomy )->labels->singular_name;
foreach ( $attribute->get_terms() as $term ){
echo '<li class="pa-filter-item"><a href="">' . $attribute_name . '</a></li>';
}
}
}
解决方案2: 如果您想保留?尝试:
private List<Serializable> dataList = new ArrayList<>();
public void add(Serializable data) {
dataList.add(data);
}
无论如何,如果您将其声明为Serializables列表,则需要用Serializables而不是任何Object填充它。
答案 1 :(得分:0)
public class test <K extends Serializable> implements Serializable
{
private static final long serialVersionUID = -793775208204855910L;
private List<K> dataList = new ArrayList<>();
public void add(K data) {
dataList.add(data);
}
}
嗯,这是我想到的最简单的方法。