Как я могу иметь параметр метода с типом, зависящим от неявного параметра? - PullRequest
0 голосов
/ 09 октября 2018
trait JsonOps[J] {
  type ObjectFields
  def partitionObjectFields(fields: ObjectFields, fieldNames: List[String]): (ObjectFields, ObjectFields)
}

def compilerNoLikey[J](stuff: ops.ObjectFields)(implicit ops:JsonOps[J]) = {}

def compilerLikey[J](stuff: Any)(implicit ops:JsonOps[J]) = {
    val stuff2 = stuff.asInstanceOf[ops.ObjectFields]
}

Вы можете увидеть мои намерения здесь.Я определяю тип в JsonOps для инкапсуляции структуры, зависящей от J. Затем, когда я захочу использовать это, у меня есть функция, которая неявно передает объект JsonOps [J], а также параметр типа ObjectFields.

Проблема в том, что ObjectFields определяется в ops, что происходит после содержимого в подписи.

Как я могу это расшифровать?

Второе определение работает, но я не люблю передавать Any вокруг,Я бы хотел, чтобы компилятор мог проверить, что передается.

1 Ответ

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

Вы должны ввести еще один параметр типа для compilerLikey и написать JsonOps с уточнением

trait JsonOps[J] {
  type ObjectFields
  def partitionObjectFields(fields: ObjectFields, fieldNames: List[String]): (ObjectFields, ObjectFields)
}

def compilerLikey[J, OF](stuff: OF)(implicit ops: JsonOps[J] { type ObjectFields = OF }) = {}

или используя Aux-pattern

trait JsonOps[J] {
  type ObjectFields
  def partitionObjectFields(fields: ObjectFields, fieldNames: List[String]): (ObjectFields, ObjectFields)
}

object JsonOps {
  type Aux[J, OF] = JsonOps[J] { type ObjectFields = OF }
}

def compilerLikey[J, OF](stuff: OF)(implicit ops: JsonOps.Aux[J, OF]) = {}
...