Ваш код не работает, потому что компилятор не знает, где получить неявные экземпляры BlockTypeFactory.
Для достижения вашей цели вы можете использовать классы типов.
Этоспособ расширяемый, вы можете иметь более одной фабрики на класс, если хотите (вам нужно поиграть с областью влияния), и вы можете определить стандартные фабрики для некоторых типов.
Вы можете кодировать неявные экземпляры ваших классов делвнутри объекта BlockTypeFactory, но это обычно так.
// your type class
trait BlockTypeFactory[A] {
def create:A
}
case class BlockchainType1()
object BlockchainType1 {
// type 1 impl
implicit val factory:BlockTypeFactory[BlockchainType1] = new BlockTypeFactory[BlockchainType1] {
def create: BlockchainType1 = BlockchainType1()
}
}
case class BlockchainType2()
object BlockchainType2 {
// type 2 impl
implicit val factory:BlockTypeFactory[BlockchainType2] = new BlockTypeFactory[BlockchainType2] {
def create: BlockchainType2 = BlockchainType2()
}
}
object BlockTypeFactory {
// get factory
def apply[A:BlockTypeFactory]:BlockTypeFactory[A] = implicitly[BlockTypeFactory[A]]
// or create
def create[A:BlockTypeFactory]:A = implicitly[BlockTypeFactory[A]].create
}
val instance1 = BlockTypeFactory[BlockchainType1].create
val instance2 = BlockTypeFactory.create[BlockchainType2]
Этот шаблон называется Type Class и используется для получения специального полиморфизма.В вашем примере вам нужен полиморфный метод findTransactions для каждого класса, определенного в BlockTypeFactory.