gpt4 book ai didi

scala - 具有泛型的Scala工厂方法

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

我有几个对象正在尝试为其编写工厂方法。

简化的是:

case class a[a1,a2](j:a1, k:a2) {}
case class b[b1,b2](j:b1, k:b2) {}

我想创建一个方法,该方法允许我传递类型并获取该类的实例。我正在尝试达到这样的目标:
class myfactory[T] {
def make[K,L](p1: K, p2: L): T[K,L] = {
new T(p1,p2)
}
}

显然这是行不通的(由于各种原因,包括“T无法接受参数”),但是是否有一个优雅的解决方案来创建这样的东西?

最佳答案

0__的答案快到了。如果您将Factory[A[_,_]]设为类型类,那么您已经准备就绪。这是名称标准化的示例:

// enable higher kinded types to prevent warnings
import scala.language.higherKinds

// our case classes
case class A[A1,A2](j:A1, k:A2)
case class B[B1,B2](j:B1, k:B2)

// Define our factory interface
trait Factory[T[_,_]] {
def make[P1,P2](p1: P1, p2: P2): T[P1,P2]
}

// Companion class makes factory easier to use
object Factory {
def apply[T[_, _]](implicit ev: Factory[T]) = ev
}

// Add implicit implementations of Factory[A]
implicit object AFactory extends Factory[A] {
def make[P1,P2](p1: P1, p2: P2): A[P1,P2] = A(p1, p2)
}

// Add implicit implementations of Factory[B]
implicit object BFactory extends Factory[B] {
def make[P1,P2](p1: P1, p2: P2): B[P1,P2] = B(p1, p2)
}

现在在REPL中测试工厂
scala> val a = Factory[A].make("one", 2)
a: A[String,Int] = A(one,2)

scala> val b = Factory[B].make(1, "two")
b: B[Int,String] = B(1,two)

关于scala - 具有泛型的Scala工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30926958/

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