Благодаря глубокому прочтению ссылки, предоставленной в комментарии Богдана Вакуленко, явный ответ на первый вопрос - пункт 2:
case class Cc(a: Int, b: Int) extends Product with Serializable with MyTraitA with MyTraitB
И еще раз спасибо Богдану Вакуленко, ответ наВторой вопрос - ничего нежелательного не должно возникать при добавлении черты Product2[Int, Int]
, если она расширяет черту Product
.
Существует бонусный ответ, который очень интересен.Если желательно поместить интерфейсы, сгенерированные компилятором, в конец порядка наследования признаков, то вместо этого необходимо явно определить интерфейсы, сгенерированные компилятором.И есть несколько способов сделать это.
Первый и самый простой способ - изменить исходный код, который выглядел следующим образом (без ссылок на Product
или Serializable
и чтобы компилятор автоматически их генерировал):
case class Cc(a: Int, b: Int) extends MyTraitA with MyTraitB
выглядеть следующим образом (явно определяя Product
и Serializable
в конце списка признаков):
case class Cc(a: Int, b: Int) extends MyTraitA with MyTraitB with Product with Serializable
Второй вариант - добавить Product with Serializable
ки / или MyTraitA
и / или MyTraitB
как таковые:
trait MyTraitA extends Product with Serializable
trait MyTraitB extends Product with Serializable
case class Cc(a: Int, b: Int) extends MyTraitA with MyTraitB
Этот метод также приводит к желательному упорядочению признаков.
case class Cc(a: Int, b: Int) extends MyTraitA with MyTraitB with Product with Serializable
Наконец, интеграция Product2[Int, Int]
так же просто, как явное определение всего, зная, что любые перекрытия будут автоматически разрешены с помощью превосходных стратегий разрешения множественного наследования, предоставляемых по умолчанию в компиляторе Scala:
case class Cc(a: Int, b: Int) extends MyTraitA with MyTraitB with Product2[Int, Int] with Product with Serializable {
override def _1: Int = a
override def _2: Int = b
}