调整传递给类的类型参数

时间:2016-02-17 22:33:46

标签: scala

假设我MyCoolClass接受类型参数T。 我们希望以这种方式定义T,具体取决于aFun

  

如果(TB类型相同){} {}应设置为aFun

     

其他如果(() => new BT的类型相同){} {}应设置为C

     

否则显示错误。

aFun

你会怎么做呢?

1 个答案:

答案 0 :(得分:2)

你不能这样做。你可以做的是在MyCoolClass中限制T,以要求一个知道如何实例化T的类型类的实例:

trait Cons[T] { def cons:T }
class MyCoolClass[T](implicit ev:Cons[T]) {
 def aFun = ev.cons
}

现在我们需要的是定义AB以及Cons[A]Cons[B](**)

class A
class B
object A { implicit def consA:Cons[A] = new Cons[A] { def cons = new A } }
object B { implicit def consA:Cons[B] = new Cons[B] { def cons = new B } }

现在在REPL:

scala> new MyCoolClass[A].aFun
res0: A = A@1521d074

scala> new MyCoolClass[B].aFun
res1: B = B@19cdb1cb

(**)如果您碰巧在REPL中尝试这样做,请记住将其复制并粘贴到:paste命令中,否则对象A和B将不会真正成为伴侣对象而且这本身不起作用