我是scala的新手,在阅读了scala之旅之后,我开始从事一个简单的项目来进行一些练习。
在我的项目中,我想通过制作一个隐式类来扩展Seq特质的功能,该类将包装Seq并在顶部添加一些功能。
我的问题是这样的:
implicit class wrapper[S[X] <: Seq[X], E](seq : S[E]) {
def funkyFunc : S[S[E]] = {
Seq[S[E]](seq)
}
}
此代码无法编译,因为编译器无法将Seq [S [E]]强制转换为S [S [E]], 所以我尝试使用这样的转换:
implicit class wrapper[S[X] <: Seq[X], E](seq : S[E]) {
def funkyFunc : S[S[E]] = {
Seq[S[E]](seq).asInstanceOf[S[S[E]]]
}
}
但是现在我的问题是在运行时,当我尝试传递从Seq扩展但列表不能强制转换为他的类型时,我们会得到异常。
我无法创建S [S [E]]类型的实例,因为Seq没有承包商。
那么我有没有一种解决方案可以让我得到像这样的行为?
implicit class wrapper[S[X] <: Seq[X], E](seq : S[E]) {
def funkyFunc : S[S[E]] = {
S[S[E]]() :+ seq
}
}
修改: 我正在使用Scala 2.13
答案 0 :(得分:2)
尝试
import scala.collection.Factory
implicit class wrapper[S[X] <: Seq[X], E](seq : S[E]) {
def funkyFunc(implicit f: Factory[S[E], S[S[E]]]) : S[S[E]] = {
Seq(seq).to(f)
}
}
List(1, 2, 3).funkyFunc // List(List(1, 2, 3))