带有泛型的Scala工厂方法

带有泛型的Scala工厂方法,scala,Scala,我有几个对象,我正试图为它们编写一个工厂方法 简而言之,这些是: 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不

我有几个对象,我正试图为它们编写一个工厂方法

简而言之,这些是:

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不能获取参数”),但是有没有一个优雅的解决方案来创建这样的东西?

new
关键字与类型参数一起使用,只与一个具体的类一起使用,因为实例化是在编译时检查的。您可以使用

可能更好的方法是提供特定的工厂

例如


0的答案几乎是正确的。如果将
工厂[A[\u,\u]]
设置为typeclass,则所有设置都已完成。以下是一个名称标准化的示例:

// 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> 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)