我想定义从Iterator[T]
到我定义的类的隐式转换:ProactiveIterator[A]
。
问题不是如何做到这一点,而是如何正确地做到这一点,即如何放置方法,以使其尽可能透明和不引人注目。理想情况下,它应该是scala.Predef
中从String
到StringOps
的隐式转换。如果转换是从库中的类转换到其他类,那么它可以在该类中定义,但AFAIK在这里是不可能的。
到目前为止,我已考虑添加object containing these conversions,类似于JavaConversions,但可能有更好的选择。
答案 0 :(得分:6)
你真的没有多少选择。所有implicits必须包含在某种对象中,并使用通配符导入导入(可以单独导入它们,但我怀疑你想要它)。
所以你会有某种暗示对象:
package foo.bar
object Implicits {
implicit class ProactiveIterator[A](i: Iterator[A]) {
...
}
}
然后,无论您在何处使用它,都必须明确导入它:
import foo.bar.Implicits._
在我看来,这是一件好事。阅读代码的人可能无法理解你的拉皮条方法的来源,因此显式导入非常有用。
您可以类似地将您的隐含置于package object
内。您必须以相同的方式将它们导入其他命名空间,但它们可用于同一包中的类。
例如,使用以下内容,foo.bar
中的任何内容都将具有此隐式类:
package foo
package object bar {
implicit class ProactiveIterator[A](i: Iterator[A]) {
...
}
}
在其他地方你import foo.bar._
(可能会也可能不会干净,取决于bar
中的内容。)