对可序列化对象使用泛化

时间:2020-07-07 19:21:07

标签: java serialization sonarlint

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

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

2 个答案:

答案 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); 
   }  
} 

嗯,这是我想到的最简单的方法。

相关问题