Scala генерирует произвольный экземпляр параметризованного класса case

Я хотел сгенерировать произвольный элемент параметризованного класса case и нашел эту библиотеку используя для этого gen ScalaCheck. Это работает для конкретных типов, но не для абстрактных; Есть ли способ обойти это?

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]
}

person Michael K    schedule 12.11.2019    source источник


Ответы (1)


Генератор случайных чисел зависит от неявного значения типа ClassTag. Однако A неизвестен до тех пор, пока другой типаж или класс фактически не расширят Foo, поэтому компилятор не может предоставить неявный параметр, как это было с fooBound. Попробуйте сохранить «a» абстрактным, а затем переопределить его в других классах или, может быть, передать A в качестве ClassTag? Посмотрите здесь исходный код, чтобы увидеть https://github.com/DanielaSfregola/random-data-generator/blob/master/js/src/main/scala/com/danielasfregola/randomdatagenerator/RandomDataGenerator.scala.

person user    schedule 12.11.2019