我有一个简单的特点
。trait BusinessObject {}
以及一个简单的类型类
trait Printer[T<:BusinessObject] { def print(instance:T): Unit }
在我的代码库中,我有几百个
BusinessObject
的实现。有些是直接实现者,有些实现子trait BusinessObject
,还有一些使用with
添加各种mixin traits。我有约10个不同的Printer
特殊实现(在各种子trait和mixin上定义),以及一个低优先级的通用fallback实例,适用于任何其他BusinessObject
,效果很好。我需要记录代码库中所有
BusinessObject
的实现,因此我使用Scala的反射机制枚举这些实现,并想要对每个实现应用一个Printer。反射机制的方法签名为:def enumerateBOs: Traversable[BusinessObject]
它返回每个BusinessObject
实现的一个实例。我的问题是,在运行时似乎没有办法为可遍历对象中的每个对象获取正确(特定)的打印机。
我已尝试使用.type
发出召唤,像这样:
enumerateBOs.head match { case bo => Printer[bo.type].print(bo) }
但是我得到了每个元素的通用回退 Printer
。
有没有办法做我想做的事情?或者,如果隐式只在编译时可用,有没有办法在编译时列出所有实现者 BusinessObject
的方式?
implicitly[Printer[_root_.${obj.getClass.getCanonicalName}]].print _
这一行放入花括号中。 - holbech