在Scala中,我如何将容器特征(如Traversable [Content])添加到另一个扩展容器的容器中(因此其内容的可见性有限?
例如,下面的代码尝试为需要Traversable的容器定义特征WithIter(当然,我实际上在Container中有其他东西)。
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)单位未定义
有简单的方法吗?
答案 0 :(得分:4)
class Instance extends WithIter {
type Value = Int
def foreach[U](f : (Container#Value) => (U)) : Unit = {}
}
如果在谈到内部类时没有指定OuterClass#
,那么将假设this.
(即特定于实例)。
答案 1 :(得分:2)
为什么使用抽象类型?泛型是直截了当的:
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)