假设我MyCoolClass
接受类型参数T
。
我们希望以这种方式定义T
,具体取决于aFun
:
如果(
T
与B
类型相同){} {}应设置为aFun
其他如果(
() => new B
与T
的类型相同){} {}应设置为C
否则显示错误。
aFun
你会怎么做呢?
答案 0 :(得分:2)
你不能这样做。你可以做的是在MyCoolClass中限制T
,以要求一个知道如何实例化T
的类型类的实例:
trait Cons[T] { def cons:T }
class MyCoolClass[T](implicit ev:Cons[T]) {
def aFun = ev.cons
}
现在我们需要的是定义A
和B
以及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将不会真正成为伴侣对象而且这本身不起作用