Зависимость в признаках наследования - PullRequest
4 голосов
/ 20 января 2010

Как в Scala добавить контейнерную черту (например, Traversable [Content]) к другой, которая расширяет контейнер (и, следовательно, имеет ограниченную видимость его содержимого?

Например, приведенный ниже код пытается определить черту WithIter для контейнера, требующего Traversable (конечно, у меня есть другие вещи в контейнере).

import scala.collection._

trait Container {
  type Value
}

trait WithIter extends Container with immutable.Traversable[Container#Value]

class Instance extends WithIter {
  type Value = Int
  def foreach[U](f : (Value) => (U)) : Unit = {}
}

Компилятор (scalac 2.8.0. Beta1-RC8) находит ошибку:

ошибка: экземпляр класса должен быть абстрактным, поскольку метод foreach в признаке GenericTraversableTemplate типа [U] (f: (Container # Value) => U) Единица не определена

Есть ли простой способ?

Ответы [ 2 ]

4 голосов
/ 20 января 2010
class Instance extends WithIter {
  type Value = Int
  def foreach[U](f : (Container#Value) => (U)) : Unit = {}
}

Если вы не укажете OuterClass#, когда говорите о внутреннем классе, то будет приниматься this. (то есть специфично для экземпляра).

2 голосов
/ 20 января 2010

Почему вы используете абстрактный тип? Обобщения просты:

import scala.collection._

trait Container[T] {}

trait WithIter[T] extends Container[T] with immutable.Traversable[T]

class Instance extends WithIter[Int] {
  def foreach[U](f : (Int) => (U)) : Unit = {println(f(1))}
}


new Instance().foreach( (x : Int) => x + 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...