РЕДАКТИРОВАТЬ 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: опечатка)
T
равноComparable
, что не гарантирует сериализуемость, поэтому, если вы проигнорируете предупреждения компилятора, вы можете создать несериализуемоеPair
. Но чаще всего это просто ложное срабатывание. - person Joachim Sauer   schedule 09.10.2020Comparable
иSerializable
, чтобы сделать ее похожей наT extends Serializable & Comparable<? super T>
, сонар не выдаст предупреждение о том, чтоfirst
иlast
не сериализуемы. Я не уверен в причине этого. Я не нашел такого правила. Возможна проблема с Sonar. - person Viral Lalakia   schedule 09.10.2020T
сComparable
наSerializable
. - person Joachim Sauer   schedule 09.10.2020