我们说我有几个班级,所有他们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)
}
但是有更优雅的方法来实现同样的目标吗?
答案 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) ...