gpt4 book ai didi

Scala 从泛型实例化一个具体类

转载 作者:行者123 更新时间:2023-12-04 12:47:23 25 4
gpt4 key购买 nike

我有一个通用的特征,如下所示:

trait MyTrait[T] {
def doSomething(elems: Seq[T])
}

然后我有一个对象工厂,其定义如下:

object MyTraitFactory {
def apply[T](param1: Boolean, param2: Boolean): MyTrait[T] = {
// based on the type of T, I would like to instantiate sub types
}
}

我有具体的实现,例如:

class MyStringTrait extends MyTrait[String]

class MyIntTrait extends MyTrait[Int]

我现在需要那个神奇的位来在我的对象工厂中寻找类型并实例化相应的实现。有什么建议吗?

最佳答案

这可以在 Scala 中使用隐式类型类来解决。为每种类型创建具有具体实现的工厂特征:

object MyTraitFactory {

def apply[T](param1: Boolean, param2: Boolean)(implicit factory: MyTraitCreator[T]): MyTrait[T] = {
// call the typeclass create method
factory.create(param1, param2)
}

// factory trait
trait MyTraitCreator[T] {
def create(param1: Boolean, param2: Boolean): MyTrait[T]
}

// provide an implicit factory object for the specific types:
object MyTraitCreator {

implicit object MyStringTraitCreator extends MyTraitCreator[String] {
override def create(param1: Boolean, param2: Boolean): MyTrait[String] = {
// create the String type here
new MyStringTrait
}
}

implicit object MyIntTraitCreator extends MyTraitCreator[Int] {
override def create(param1: Boolean, param2: Boolean): MyTrait[Int] = {
// create the Int type here
new MyIntTrait
}
}
}
}

Scala 使用隐式参数“隐藏”类型类。但要使其正常工作,您必须确保将隐式工厂对象保存在编译器查找隐式对象的某个位置(例如,如上所述 MyTraitCreator 的伴随对象)。该模式在没有 implicit 的情况下也能正常工作,但需要调用者在每次调用时提供具体工厂。

此解决方案包含大量样板代码,但在编译时静态工作,并且不受类型删除的影响。它甚至在 scala 中带有语法糖:

def apply[T: MyTraitCreator](param1: Boolean, param2: Boolean): MyTrait[T] = {
// call the typeclass create method
implicitly[MyTraitCreator[T]].factory.create(param1, param2)
}

关于Scala 从泛型实例化一个具体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38577254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com