鉴于以下内容:
trait A
trait Service{
type tA <: A
def ping(a:tA)
}
// implementations
class A1 extends A
class A2 extends A
class ServiceA1{
type tA = A1
def ping(a:tA){println("Service for A1")}
}
class ServiceA2{
type tA = A2
def ping(a:tA){println("Service for A2")}
}
// a collection of services
val services = Seq(new ServiceA1, new ServiceA2, ....)
// find the service that supports A1
services.find(_.tA =:= A1)
显然以上不会编译。有没有办法在运行时确定类型变量的具体类型?
答案 0 :(得分:0)
您可以在tATag
特征中添加一个抽象方法(Service
),该特征会返回tA
的TypeTag,并在ServiceA1
和ServiceA2
中实现此方法( btw你的服务应该相应地扩展Service
特征)并在比较时使用它,如下所示:
trait Service {
type tA <: A
def ping(a:tA)
def tATag: TypeTag[tA]
}
class ServiceA1 extends Service {
type tA = A1
def ping(a:tA){println("Service for A1")}
def tATag = typeTag[A1]
}
class ServiceA2 extends Service {
type tA = A2
def ping(a:tA){println("Service for A2")}
def tATag = typeTag[A2]
}
// a collection of services
val services = Seq(new ServiceA1, new ServiceA2)
// find the service that supports A1
services.find(s => s.tATag.tpe =:= typeOf[A1])