Scala синтаксис с границами сложного полиморфизма - PullRequest
0 голосов
/ 28 апреля 2020

Существует ли механизм scala для упрощения длинных границ полиморфизма? например:

case class RecordTypeX(...) extends A with B with C with D with E with F // defined in my project
case class RecordTypey(...) extends A with B with C with D with E with F // defined in a dependency package

class MyClass1[T <: A with B with C with D with E with F](x:T) {...}
class MyClass2[T <: A with B with C with D with E with F](x:T) {...}
...

val x = RecordTypeX(...)
val y = RecordTypeY(...)
val instance = new MyClass1(x)
val instance = new MyClass1(y)

В идеале было бы неплохо иметь что-то вроде

type Processable=A with B with C with D with E with F
case class RecordTypeX(...) extends Processable // defined in my project
case class RecordTypeY(...) extends A with B with C with D with E with F // defined in a dependency package

class MyClass1[T <: Processable]() {...}
class MyClass2[T <: Processable]() {...}
...

val x = RecordTypeX(...)
val y = RecordTypeY(...)
val instance = new MyClass1(x)
val instance = new MyClass1(y)

Есть какое-нибудь решение?

Примечание. Введение новой черты, объединяющей все остальные черты и расширяющей ее для всех возможных классов, таких как

trait Processable extends A with B with C with D with E with F

, не может быть решением, поскольку я не могу изменить RecordTypeY.

1 Ответ

2 голосов
/ 29 апреля 2020

Вы можете сделать комбинацию обоих.

trait A
trait B
trait C
trait D
trait E
trait F

type Processable = A with B with C with D with E with F
trait ProcessableI extends A with B with C with D with E with F

final case class RecordTypeX(s: String) extends ProcessableI
final case class RecordTypeY(i: Int) extends A with B with C with D with E with F

class MyClass[T <: Processable](x: T)

val x = RecordTypeX("foo")
val y = RecordTypeY(3)
val instance1 = new MyClass(x)
val instance2 = new MyClass(y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...