Во время тестирования некоторого кода, который я недавно создал, я понял, что некоторые отрывки не компилируются без явной аннотации типа.Я попытался минимизировать проблему в следующем фрагменте кода:
case class Base[E,S](al:Set[E],sts:Set[MidState[S]],ss:MidState[S],
d:Map[(MidState[S],E),MidState[S]],aS:Set[MidState[S]])
case class Edge[E,S](state_1: MidState[S],l:E ,state_2: MidState[S])
sealed trait MidState[S] extends BaseState[S]
sealed case class State[S](l:S)
extends MidState[S]
case object FailureState extends MidState[Nothing]
База имеет объект-компаньон с методом apply, определенным следующим образом:
object Base {
def apply [E,S](edges:Set[Edge[E,S]],ss:MidState[S],
aS:Set[MidState[S]],partialMode:Boolean): Base[E,S]
Когда я пытаюсь создать экземпляр Baseс помощью этого метода применения я не могу обойти явную аннотацию типа для aS:
val aS : Set[MidState[String]] = (State("C") :: Nil).toSet
val base = Base(edges,State("A"),aS,partialMode = true)
Если я удаляю аннотацию явного типа для aS , aS имеет тип Установите [State [S]] , а не Установите [MidState [S]] , который должен быть для метода применения.Есть ли лучшее решение, чтобы избежать этой явной аннотации типа, несмотря на вставку (State ("C") :: Nil) .toSet непосредственно в метод apply?