Scala 生成参数化案例的任意实例 class
Scala generate arbitrary instance of parametrized case class
我想生成参数化案例的任意元素 class,并发现 this library 使用 ScalaCheck 的 gen
来完成它。这适用于具体类型,但不适用于抽象类型;有办法解决这个问题吗?
import com.danielasfregola.randomdatagenerator.RandomDataGenerator._
sealed trait FooBound {
def bar: String
}
trait Foo[A <: FooBound] {
implicit val fooBound = random[FooBound] // works fine
implicit val a = random[A]
// fails due to: could not find implicit value
// for evidence parameter of type
// org.scalacheck.Arbitrary[A]
}
随机生成器依赖于 ClassTag 类型的隐式值来完成它的工作。但是,直到另一个特征或 class 实际上扩展了 Foo,A 才为人所知,因此编译器无法像对 fooBound 那样提供隐式参数。尝试保持 'a' 抽象,然后在其他 class 中覆盖它,或者将 A 作为 ClassTag 传入?看这里的源码可以看到https://github.com/DanielaSfregola/random-data-generator/blob/master/js/src/main/scala/com/danielasfregola/randomdatagenerator/RandomDataGenerator.scala
我想生成参数化案例的任意元素 class,并发现 this library 使用 ScalaCheck 的 gen
来完成它。这适用于具体类型,但不适用于抽象类型;有办法解决这个问题吗?
import com.danielasfregola.randomdatagenerator.RandomDataGenerator._
sealed trait FooBound {
def bar: String
}
trait Foo[A <: FooBound] {
implicit val fooBound = random[FooBound] // works fine
implicit val a = random[A]
// fails due to: could not find implicit value
// for evidence parameter of type
// org.scalacheck.Arbitrary[A]
}
随机生成器依赖于 ClassTag 类型的隐式值来完成它的工作。但是,直到另一个特征或 class 实际上扩展了 Foo,A 才为人所知,因此编译器无法像对 fooBound 那样提供隐式参数。尝试保持 'a' 抽象,然后在其他 class 中覆盖它,或者将 A 作为 ClassTag 传入?看这里的源码可以看到https://github.com/DanielaSfregola/random-data-generator/blob/master/js/src/main/scala/com/danielasfregola/randomdatagenerator/RandomDataGenerator.scala