有没有办法在 Scala 中创建通用类型的实例而不是反射

Is there a way to create an instance of a generic type in Scala other than reflection

我是 scala 的新手,在阅读了 scala 教程后,我开始做一个简单的项目来练习一下。

在我的项目中,我想通过创建一个隐式 class 来扩展 Seq 特性的功能,该隐式 class 将包装 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

尝试

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))