тип ограничения списка объектов по типу свойства объекта - PullRequest
0 голосов
/ 15 октября 2018

Предполагая, что класс подобен этому:

sealed trait ParentTrait
sealed trait Trait1 extends ParentTrait
sealed trait Trait2 extends ParentTrait
...
case object O1 extends extends Trait1
case object O2 extends extends Trait1
....
....
case object Oi extends Trait2
case object Oj extends Trait2

case class A {
   ... fields ...
   val someField: ParentTrait 
}

Как я могу ограничить функцию для приема объектов A с someField типа Trait2?

т.е.

def myFunction(seq : Seq[A where A.someField is a Trait2] = {
  here each item.someField in seq is a Trait2 type
}

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Это невозможно.Проверка типа выполняется во время компиляции, но конкретный тип someField неизвестен до времени выполнения.Все, что знает компилятор, это то, что это подкласс ParentTrait, он не может знать, какой из них будет присутствовать при вызове функции.

Вы можете использовать match в myFunction для проверкичто у вас есть нужный вам тип, или создайте два варианта A для двух возможных типов someField.

Если только здесь нет веской причины для проверки статического типа, я бы предложил использовать match и наличие модульного тестирования обнаружит случайное использование функции с «неправильным» значением someField.Если вы пойдете по пути вариантов / обобщений, ваш код очень быстро станет очень сложным.

0 голосов
/ 15 октября 2018

Я мог бы как-то неправильно понять вопрос, но если вы хотите ограничить функцию получением классов наблюдений, которые содержат только определенные типы элементов, то подойдет следующее:

scala> :paste
// Entering paste mode (ctrl-D to finish)

sealed trait ParentTrait
sealed trait Trait1 extends ParentTrait
sealed trait Trait2 extends ParentTrait

case object O1 extends Trait1
case object O2 extends Trait1

case object Oi extends Trait2
case object Oj extends Trait2

case class A[PT <: ParentTrait](someField: PT)

def myfunc[PT <: ParentTrait](seq: Seq[A[PT]]) : Unit = ???

val st1: Seq[A[Trait1]] = Seq(A(O1), A(O2))
val st2: Seq[A[Trait2]] = Seq(A(Oi), A(Oj))

myfunc[Trait2](st2)
myfunc[Trait2](st1)

// Exiting paste mode, now interpreting.

<pastie>:31: error: type mismatch;
 found   : Seq[A[Trait1]]
 required: Seq[A[Trait2]]
myfunc[Trait2](st1)
           ^
...