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

Jea*_*let 10 scala implicit-conversion scala-java-interop companion-object

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

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

oxb*_*kes 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
  }
Run Code Online (Sandbox Code Playgroud)

然后可以使用:

import my.domain._
val tu : TimeUnit = TimeUnit.valueOf("MILLISECONDS")
Run Code Online (Sandbox Code Playgroud)

但你domain.TimeUnit是一个模块(即scala object)

  • 这不是伴侣对象. (5认同)
  • 它至少不适用于隐式转换(这是伴随对象的最佳位置) (3认同)

Jam*_*Iry 9

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

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