Коллекция объектов с саморекурсивным типом в scala - PullRequest
0 голосов
/ 18 января 2019
trait Node[N<:Node[N]] { self:N =>
}

trait A extends Node[A]

trait B {
  def list:List[Node[_]]

  def as:List[A] = list.collect { case x:A => x }
}

У меня проблемы с использованием саморекурсивного типа в коллекциях. В этом примере компилятор выдает ошибку

 def as = list.collect { case x:A => x }
                       ^
type arguments [_$1] do not conform to trait Node's type parameter bounds [N <: Node[N]]

потому что подстановочный знак в List [Node [_]] не соответствует границе типа. Есть ли какой-нибудь правильный способ указать тип шаблона для рекурсивного ограничения? Один обходной путь -

  def as = {
    list match {
      case list:List[Node[n]] => list.collect { case x:A => x }
    }
  }

, что довольно некрасиво.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вы можете решить эту проблему с помощью экзистенциального

trait Node[N<:Node[N]] { self:N =>
}

trait A extends Node[A]

trait B {
  def list:List[X forSome {type X <: Node[X]}]

  def as:List[A] = list.collect { case x:A => x }
}

просто справедливое предупреждение forSome будет удалено из скалы в какой-то момент. Можете ли вы рассказать нам больше о том, что вы пытаетесь сделать? Майбер, есть более элегантный способ сделать это

0 голосов
/ 18 января 2019

Это похоже на работу:

trait B {
  def list: List[_ <: Node[_]]

  def as:List[A] = list.collect { case x:A => x }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...