SonarLint V3:“可序列化”类中的字段对于 List 接口应该是瞬态的或可序列化的

Bre*_*min 4 java intellij-idea sonarqube sonarlint

我的问题与此非常相似,只是我在 SonarLint V3 (squid:S1948) 中遇到了这个问题。

我的代码是:

public class Page<T> implements Serializable {

    Summary summary;
    List<T> elements;

    public Page() {
        summary = new Summary();
    }

    public List<T> getItemsReceived() {
        return elements;
    }

    public void setItemsReceived(List<T> list) {
        this.elements = list;
    }

    public Summary getSummary() {
        return summary;
    }

    public void setSummary(Summary summary) {
        this.summary = summary;
    }

}
Run Code Online (Sandbox Code Playgroud)

摘要对象实现了可序列化。

public class Summary implements Serializable {

    int offset;
    int limit;
    long totalElements;

    public int getOffset() {
        return offset;
    }

    public void setOffset(int offset) {
        this.offset = offset;
    }

    public int getLimit() {
        return limit;
    }

    public void setLimit(int limit) {
        this.limit = limit;
    }

    public long getTotalNumberOfElements() {
        return totalElements;
    }

    public void setTotalNumberOfElements(long totalNumberOfElements) {
        this.totalElements = totalNumberOfElements;

    }

}
Run Code Online (Sandbox Code Playgroud)

现在,如果我用 ArrayList 替换 List ,那么 SonarLint 中会出现另一个警告,即我们应该使用接口而不是实现类。

我认为这可能会在 SonarQube 中得到解决,但对于 SonarLint 我不知道。这是一个错误还是我做错了什么?

Tib*_*ssy 5

SonarLint 是对的。问题是不能保证该elements字段是可序列化的。您需要T像这样在类型上添加类型绑定

public class Page<T extends Serializable> implements Serializable {}
Run Code Online (Sandbox Code Playgroud)

这样,如果为其选择的实现是可序列化的,则列表将是可序列化的(对于 Java 中的标准集合类型来说也是如此)。