Ошибка несоответствия типов в Scala при попытке просмотра параметризованного или абстрактного конструктора типа в качестве верхней границы - PullRequest
0 голосов
/ 23 марта 2011

Разобранный пример:

trait WithUpperBounds[AA[_] <: Set[_], Node, Edge] {
    val nodes: AA[Node]
    val edges: AA[Edge]
}

class WithoutUpperBounds[AA[_] <: Set[_], Node, Edge](
    val nodes: AA[Node],
    val edges: AA[Edge]
) extends WithUpperBounds[AA, Node, Edge] {
    val nodes2Set: Set[Node] = nodes
    val edges2Set: Set[Edge] = edges
}

Вывод REPL:

scala> :l …/Sandbox.scala
Loading …/Sandbox.scala...
defined trait WithUpperBounds
<console>:10: error: type mismatch;
 found   : AA[Node]
 required: Set[Node]
        val nodes2Set: Set[Node] = nodes
                                   ^
<console>:11: error: type mismatch;
 found   : AA[Edge]
 required: Set[Edge]
        val edges2Set: Set[Edge] = edges
                                   ^

Функции высшего порядка, особенно для понимания, усугубляют мою проблему.

Ответы [ 2 ]

1 голос
/ 23 марта 2011

Измените подстановочный знак в описании Seq [_] следующим образом:

class WithoutUpperBounds[AA[_] <: Seq[_ <: Node], B <: Node](val nodeSeq: AA[B]) extends WithUpperBounds[AA, B] {
0 голосов
/ 25 марта 2011

@ Торедж указал мне в правильном направлении.Я нашел решение в Predef.scala:

type Set[A] = collection.immutable.Set[A]

Подстановочные знаки отбрасывают эквивалентность типов, но вместо этого вы можете абстрагироваться над любым произвольным параметром без его объявления.Моя черта теперь выглядит так:

trait WithUpperBounds[AA[B] <: Set[B], Node, Edge]…
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...