Generics 参数化类型的特定生成器

Generics 参数化类型的特定生成器,generics,scala,types,builder,parameterized,Generics,Scala,Types,Builder,Parameterized,我试图在scala中编写一个类,它包装(参数化)集合并重写它的foreach方法。对于这个问题来说,它对foreach方法所做的事情并不重要,所以假设它只是在访问每个元素时打印出来。因此,理想情况下,我们可以按如下方式使用包装器: scala> val a = List(1,2,3,4,5) scala> val b = MyWrapper(a) scala> b.foreach{ x => x } 1 2 3 4 5 关键是我想让它与任何iterable一起工作;不仅

我试图在scala中编写一个类,它包装(参数化)集合并重写它的foreach方法。对于这个问题来说,它对foreach方法所做的事情并不重要,所以假设它只是在访问每个元素时打印出来。因此,理想情况下,我们可以按如下方式使用包装器:

scala> val a = List(1,2,3,4,5)
scala> val b = MyWrapper(a)
scala> b.foreach{ x => x }
1
2
3
4
5
关键是我想让它与任何iterable一起工作;不仅仅是一份清单。所以我的第一次尝试就像下面的一样

class MyWrapper[A, S[A] <: Iterable[A]]( val s: S[A] with IterableLike[A, S[A]]) 
      extends IterableLike[A, S[A]] {

        override def foreach[U](f: A => U): Unit = {
          iterator.foreach{ x => println(x); f(x) }
        }  
 }
问题是当我试图定义newBuilder时。我需要生成器返回一个S[A]。但是,S[A]是一个以Iterable[A]为边界的参数化集合。因此,我所有使用genericBuilder或获取伴生对象的builder的尝试都会导致Iterable[A]而不是s[A],并显示相应的错误消息

[error] method newBuilder in trait TraversableLike of type => scala.collection.mutable.Builder[A,S[A]] is not defined
[error] method seq in trait Parallelizable of type => scala.collection.TraversableOnce[A] is not defined 
如何获得生成特定类型S[a]而不是泛型有界类型Iterable[a]的生成器?这可能吗?如果您能帮助您理解惯用的Scala方法(或任何实际可行的方法),我们将不胜感激

IterableLike(以及其他XxxLike特征)通过委托给特定于每种集合类型的构建器来抽象返回类型。因此,你正在尝试的东西是行不通的


您可以创建一个通用包装器MyWrapper,如[a,B]和两个特定包装器MyEqWrapper[a]扩展MyWrapper,如[a,Seq[a]](对于集合、映射、列表等也一样),即模仿Scala集合库的设计。

我不知道您的问题的答案,但我想知道您是否可以在iterable上创建一个方法?如果是这样的话,你可以通过提供一个“wrappedForeach”而不是几行代码来获得你想要的。你考虑过使用
代理吗?嗨,丹尼尔。在你发表评论之前,我不知道有代理。有没有资源(除了原始API)可以让我了解它们?谢谢进一步研究代理,似乎我真正想要的东西无法用它们实现。特别是,我想重写foreach方法,因为有很多其他方法都是用它实现的。实际上,我的动机是改变foreach的行为,并有一个适当修改的filter/map/etc,这很有趣。因此,我有一个特定的(但参数化的)S[a]类型的事实不允许我以任何方式访问S[a]的特定构建器?我想这只是因为s[A]上的标称类型只确保它是可写的,对吗?我可以通过某种方式(例如使用清单)获取具体类型吗?
[error] method newBuilder in trait TraversableLike of type => scala.collection.mutable.Builder[A,S[A]] is not defined
[error] method seq in trait Parallelizable of type => scala.collection.TraversableOnce[A] is not defined