【发布时间】:2014-01-07 02:47:00
【问题描述】:
我在object 中定义了隐式转换。让我们调用对象Implicits,其中有一个隐式转换。
package com.gmail.naetmul.stackoverflow.app
object Implicits {
implicit def int_to_intEx(x: Int): IntEx = IntEx(x)
}
这个对象在某个包中。我想在包com.gmail.naetmul.stackoverflow.app 及其所有子包(如com.gmail.naetmul.stackoverflow.app.something.anything.everything)中的每个代码中使用这种隐式转换。
所以我做了com.gmail.naetmul.stackoverflow.app的包对象。
package com.gmail.naetmul.stackoverflow
package object app {
import com.gmail.naetmul.stackoverflow.app.Implicits._
}
但它在确切的包对象之外不起作用。
于是我把对象Implicits改成了trait,让包对象扩展它。
package com.gmail.naetmul.stackoverflow.app
trait Implicits {
implicit def int_to_intEx(x: Int): IntEx = IntEx(x)
}
package com.gmail.naetmul.stackoverflow
import com.gmail.naetmul.stackoverflow.app.Implicits
package object app extends Implicits {
// some code
}
隐式转换在包com.gmail.naetmul.stackoverflow.app 中起作用。但是,它在子包中工作或不工作。
例如)
文件A.scala
package com.gmail.naetmul.stackoverflow.app.database
class A {
// Here, the implicit conversion did NOT work.
}
文件B.scala
package com.gmail.naetmul.stackoverflow.app
package database
class B {
// Here, the implicit conversion DID work.
}
所以问题是:
在这种情况下我应该使用
trait而不是object(与包对象一起使用,但在外部定义)?还有其他方法可以在子包中使用隐式转换吗? 我的意思是,只导入一次,并在任何地方使用它们。
B.scala中的工作方式看起来不错,但是 Eclipse 的默认包语句类似于A.scala,所以我必须手动更改它们。
【问题讨论】:
-
B.scala 中的多行包声明是获得你想要的行为的方式。如果你把它放在像 A.scala 这样的一行上,你只会得到那个包的包对象。我不相信有任何其他方法可以实现这一目标。因此,我认为您要么手动更改这些声明,要么说服 Eclipse 这样做。我使用 IntelliJ IDEA,为此您可以为每个模块指定基本包,它会使子包中任何代码的包声明自动使用两行(基本一行,其余行)。
标签: scala package implicit-conversion