将包作为另一个名称导入

6
假设我有一个Scala项目,其中有一堆位于包com.example.a.b.c下的case类。我想将所有这些类导入到一个包com.example.c中(该包包含一些其他不冲突的case类),以便在项目的任何其他地方,我只需要import com.example.c._就可以使用来自com.example.ccom.example.a.b.c的每个case类。
我该怎么做?

你是否只是试图以逻辑方式组织代码,并且对组织有控制权?如果是这样,你可以在一个特质(或多个特质)中定义你的 com.example.a.b.c case 类,然后编写 package object c extends ThatTrait。例如,Scalaz 广泛使用这种方法。 - Travis Brown
这是一个有趣的方法!我需要与团队讨论,因为我实际上无法控制 com.example.a.b.c - user510159
2个回答

8

有关添加导出机制的讨论正在进行中,该机制可以实现您想要的功能,但目前尚不清楚是否会实现。

无论如何,现在唯一的方法是:

  • 定义每个类的类型
  • 将每个对象设置为相应的值

例如:

package bar
case class Foo(i: Int) {}

需要在另一个软件包中模仿此功能。
package object baz {
  type Foo = bar.Foo
  val Foo = bar.Foo
}

面对这种情况,人们通常只会选择额外导入一两个文件。

谢谢Rex!已接受!我同意额外导入是简单的解决方案,但当你需要到处使用它们并最终得到4个额外的导入语句时,这真的很麻烦。而且为了维护目的,我宁愿在一个地方处理所有的重大变更。 - user510159

1
Scala 中的 import 语句只是告诉编译器在哪里找到其他类,就像 Java 中一样,而不像 C/C++ 中的 #include 指令那样,编译器会物理复制整个头文件。如果您想使用来自 com.example.a.b.c 的 case classes,则应该从它们自己的包中导入,因为这是惯例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接