具有特殊构造函数并调用它的泛型类型

时间:2013-11-20 06:26:45

标签: scala

我们说我有几个班级,所有他们extend Response(response),也就是说,都有相同的构造函数:

import scalaj.http.Http

class MyClass1(response: Http.Request) extends Response(response) { 
  //....
}

class MyClass2(response: Http.Request) extends Response(response) { 
  //....
}

如何创建一个只接受上述类的类型并调用其构造函数的泛型方法:

def myGeneric[A <: ???](r: Http.Request)  = {
  new A(r) // doesn't compile
}

我想这样称呼它:

myGeneric[MyClass1](r) // r is Http.Request

我可以这样做:

def myGeneric[A <: ???](r: Http.Request)(f: r => A)  = {
  f(r) // f - is the constructor
}

myGeneric[MyClass1](r) { x =>
  new MyClass1(x)
}

但是有更优雅的方法来实现同样的目标吗?

1 个答案:

答案 0 :(得分:0)

也许你可以让myGeneric将工厂作为隐含参数。例如:

def myGeneric[A](r: Request)(implicit f: Request => A) {
  ...  val a = f(r)  ...

如果我没记错的话,那样的隐式函数可能会让人感到困惑,所以也许......

trait MyFactory[T] {
    def make(r: Request): T
}
...
def myGeneric[A](r: Request)(implicit f: MyFactory[A]) ...
// which is same as...
def myGeneric[A : MyFactory](r: Request) ...
相关问题