除了反射之外,是否有办法在Scala中创建泛型类型的实例

时间:2019-07-19 10:30:38

标签: scala scala-collections

我是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

1 个答案:

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