如何进行嵌套导入
How to Do Nested Imports
我正在尝试清理我的用户 api,以便用户可以整齐地从单个包对象导入,并获取其中的所有内容。我意识到我可以将我的包裹移动到顶部包裹中,但我想知道是否有办法执行以下操作(我知道这可能不是最佳做法):
我有以下包裹:
package org.Me.packages.packageA
case class A() {
// some implementation
}
package org.Me.packages.packageB
case class B() {
// some implementation
}
现在这需要导入以下形式:
import org.Me.packages.packageA.A
import org.Me.packages.packageB.B
我被要求做的事情如下:
package org.Me.combinedPackages
package object Combined {
import org.Me.packages.packageA.A
import org.Me.packages.packageB.B
}
这样我的最终用户就可以简单地做到:
import org.Me.combinedPackages._
// access both a and b here
根据我阅读的内容 here,我的理解是嵌套导入是不可能的。
所以我想做的事情是不可能的吗?我意识到还有其他方法。
在 Dotty 中,您可以通过 export
(双重 import
)实现您想做的事情:
package org.Me.combinedPackages
export org.Me.packages.packageA.A
export org.Me.packages.packageB.B
但是在 Scala 2 中你必须:
- 为您想要“传递”的每个类型使用一个类型别名,以便从您的包中访问
- 为您希望通过您的包重定向的每个(伴随)对象使用
val
package my.package
// imported as my.package.exported._
package object exported {
type NormalType = some.other.package.NormalType
val NormalType: some.other.package.NormalType.type =
some.other.package.NormalType
type ParametricType[F[_], A] = some.other.package.ParametricType[F, A]
val ParametricType: some.other.package.ParametricType.type =
some.other.package.ParametricType
// be careful to not import things that are automatically imported
// e.g. implicits in companions, and avoid importing the same implicit
// twice from two different packages
implicit val redirectedImplicit: some.other.package.SomeImplicit =
some.other.package.SomeImplicit
}
以防万一,我只提一下这会中断,例如宏注解,就好像你在宏注解类型中有这样的别名,编译器将无法识别它应该使用原始类型的宏扩展来处理它。
我正在尝试清理我的用户 api,以便用户可以整齐地从单个包对象导入,并获取其中的所有内容。我意识到我可以将我的包裹移动到顶部包裹中,但我想知道是否有办法执行以下操作(我知道这可能不是最佳做法):
我有以下包裹:
package org.Me.packages.packageA
case class A() {
// some implementation
}
package org.Me.packages.packageB
case class B() {
// some implementation
}
现在这需要导入以下形式:
import org.Me.packages.packageA.A
import org.Me.packages.packageB.B
我被要求做的事情如下:
package org.Me.combinedPackages
package object Combined {
import org.Me.packages.packageA.A
import org.Me.packages.packageB.B
}
这样我的最终用户就可以简单地做到:
import org.Me.combinedPackages._
// access both a and b here
根据我阅读的内容 here,我的理解是嵌套导入是不可能的。
所以我想做的事情是不可能的吗?我意识到还有其他方法。
在 Dotty 中,您可以通过 export
(双重 import
)实现您想做的事情:
package org.Me.combinedPackages
export org.Me.packages.packageA.A
export org.Me.packages.packageB.B
但是在 Scala 2 中你必须:
- 为您想要“传递”的每个类型使用一个类型别名,以便从您的包中访问
- 为您希望通过您的包重定向的每个(伴随)对象使用
val
package my.package
// imported as my.package.exported._
package object exported {
type NormalType = some.other.package.NormalType
val NormalType: some.other.package.NormalType.type =
some.other.package.NormalType
type ParametricType[F[_], A] = some.other.package.ParametricType[F, A]
val ParametricType: some.other.package.ParametricType.type =
some.other.package.ParametricType
// be careful to not import things that are automatically imported
// e.g. implicits in companions, and avoid importing the same implicit
// twice from two different packages
implicit val redirectedImplicit: some.other.package.SomeImplicit =
some.other.package.SomeImplicit
}
以防万一,我只提一下这会中断,例如宏注解,就好像你在宏注解类型中有这样的别名,编译器将无法识别它应该使用原始类型的宏扩展来处理它。