在Scala中,如何为Java中定义的类定义伴随对象?

时间:2011-02-07 13:26:49

标签: scala implicit-conversion scala-java-interop companion-object

我想将隐式转换添加到由建模工具生成的Java类中。所以我想将它们添加到这些类的伴随对象中,以便编译器自动找到它们。但我无法将它们添加到单独的文件中,因为必须在同一文件中定义随播广告。我能做些什么吗?

当然,我可以在另一个对象中定义所有隐式转换,然后将其带入范围,但这需要额外导入。还有其他解决办法吗?

2 个答案:

答案 0 :(得分:9)

您当然可以定义自己的伴侣对象,我经常在我自己的项目特定Predef中安排。例如:

object domain {

  type TimeUnit = java.util.concurrent.TimeUnit
  object TimeUnit {
    def valueOf(s : String) = java.util.concurrent.TimeUnit.valueOf(str)
    val Millis = java.util.concurrent.TimeUnit.MILLISECONDS
    //etc
  }

然后可以使用:

import my.domain._
val tu : TimeUnit = TimeUnit.valueOf("MILLISECONDS")

但您的domain.TimeUnit是一个模块(即scala object

答案 1 :(得分:9)

现在使用Scala编译器除了将它们放在同一个文件中之外,无法定义伴随对象。您可以做的最好的是具有相同包和名称以及额外导入的非伴随对象。

如果你能想出一个很好的方法来创建事后陪伴而不打破关于封装的假设,请在http://groups.google.com/group/scala-debate上发帖,因为它显然是一个非常有用的功能。