Как сериализовать общий класс, который может быть параметром собственного типа?

РЕДАКТИРОВАТЬ 2: Проблема решена. Спасибо Йоахиму Зауэру и Виралу Лалакии за их ответы.

Решение. SonarLint не выдаст предупреждение, если я поменяю местами Comparable<T> и Serializable на тип T. Предупреждение, которое он дает, следует считать ложным срабатыванием.


Первоначальный выпуск:

Итак, у меня есть общий класс Pair<T>, который я хочу назвать Serializable и Comparable. Кроме того, я хочу, чтобы T было Comparable (и мне нужно, чтобы оно было Serializable, чтобы Pair<T> тоже можно было сериализовать).

Класс PairCoord наследуется от него, причем T является классом Integer.

Я использую SonarLint для анализа кода и пытаюсь заставить себя следовать каждому совету (особенно очень важному), и он постоянно предупреждает меня о том, что атрибуты универсального класса Pair не являются сериализуемыми, несмотря на то, что они помечены как таковые.

Вот что я сделал:

public class Pair<T extends Comparable<? super T> & Serializable> implements Comparable<Pair<T>>, Serializable {

    private static final long serialVersionUID = 5797102044530257848L;
    
    
    private T first;
    private T last;

    public Pair(T first, T last) {
        this.first = first;
        this.last = last;
    }
    public Pair() {
    }

    // And so on
}

public class PairCoord extends Pair<Integer> implements Serializable {

    private static final long serialVersionUID = 8389593640798914292L;
    

    public PairCoord(int first, int last) {
        super(first, (last + 8) % 8);
        // Since each of the 3 squares are loops, the node before n°0 is therefore n°-1
        // Except that n°-1 doesn't exist, but (-1 mod 8) = 7 
        // The only issue is that % isn't a modulo, but the remain of the euclidean division
        // So by adding 8 to "last", I make sure that the number in the operation is positive,
        // and since for all x >= 0, % behaves like mod, I have my node number correct (between 0 and 7) 
    }

}

И у меня есть критические предупреждения SonarLint для полей first и last, поскольку они не сериализуемы, хотя я пометил их как таковые («Поля в сериализуемом классе должны быть либо переходными, либо сериализуемыми»)

Что я могу сделать, чтобы исправить это (если это возможно)?

(Редактировать 1: опечатка)


person G-Crow    schedule 09.10.2020    source источник
comment
Вероятно, это проблема с тем, что sonarlint не понимает ваш код. Это может быть связано с тем, что стирание T равно Comparable, что не гарантирует сериализуемость, поэтому, если вы проигнорируете предупреждения компилятора, вы можете создать несериализуемое Pair. Но чаще всего это просто ложное срабатывание.   -  person Joachim Sauer    schedule 09.10.2020
comment
Если вы измените последовательность Comparable и Serializable, чтобы сделать ее похожей на T extends Serializable & Comparable<? super T>, сонар не выдаст предупреждение о том, что first и last не сериализуемы. Я не уверен в причине этого. Я не нашел такого правила. Возможна проблема с Sonar.   -  person Viral Lalakia    schedule 09.10.2020
comment
@ViralLalakia: это, вероятно, работает, потому что оно изменяет стирание (т. Е. Фактический базовый тип, используемый JVM при отсутствии общей информации времени выполнения) T с Comparable на Serializable.   -  person Joachim Sauer    schedule 09.10.2020


Ответы (1)


private static final long serialVersionUID = 5797102044530257848L;

private T first;
private T last;

public Pair(T first, T last) {
    this.first = first;
    this.last = last;
}
public Pair() {
}

// And so on

}

открытый класс PairCoord расширяет Pair, реализует Serializable {

private static final long serialVersionUID = 8389593640798914292L;


public PairCoord(int first, int last) {
    super(first, (last + 8) % 8);
    // Since each of the 3 squares are loops, the node before n°0 is therefore n°-1
    // Except that n°-1 doesn't exist, but (-1 mod 8) = 7 
    // The only issue is that % isn't a modulo, but the remain of the euclidean division
    // So by adding 8 to "last", I make sure that the number in the operation is positive,
    // and since for all x >= 0, % behaves like mod, I have my node number correct (between 0 and 7) 
}

}

person Matthew Hauther    schedule 09.10.2020
comment
Что это значит для улучшения? Публикуя ответы, пожалуйста, опишите, что вы делаете, а не только код. - person Joachim Sauer; 09.10.2020