Scala 限定导入,如果可能,使用别名

Scala 限定导入,如果可能,使用别名,scala,Scala,我正在学习Scala,有一个名称中没有点的包:test。我现在想将这个包中的东西导入到另一个Scala文件中,但我 不希望使用通配符导入,因为我希望防止名称冲突(因此无导入测试。) 不想导入单个类(因此无导入测试。{My,Manually,maintenanted,List,Of,classes}) 是否希望将test保留为顶级包(因此没有嵌套包。test) 希望将包别名为较短的名称(类似于import{test=>t}) 我一直在玩,但直到现在才成功。我使用scalac a.scala b

我正在学习Scala,有一个名称中没有点的包:
test
。我现在想将这个包中的东西导入到另一个Scala文件中,但我

  • 不希望使用通配符导入,因为我希望防止名称冲突(因此无
    导入测试。
  • 不想导入单个类(因此无
    导入测试。{My,Manually,maintenanted,List,Of,classes}
  • 是否希望将
    test
    保留为顶级包(因此没有嵌套
    包。test
  • 希望将包别名为较短的名称(类似于
    import{test=>t}
我一直在玩,但直到现在才成功。我使用
scalac a.scala b.scala编译:

  • 文件
    a.scala
包测试
A类{}
  • 使用文件
    b.scala
    进行实验,但没有一个有效:
import\u root.{test=>t}//错误:\u root\u无法导入
类扩展了t.A{}
import\u root\u.test//错误:\u root\u无法导入
类扩展test.A{}
导入测试//错误:。预期 类扩展test.A{}
import test.A//警告:导入的'A'被类A的定义永久隐藏
类A扩展了{}//错误:涉及类A的非法循环引用
import{test=>t}//错误:需要标识符,但找到了“{”。
//错误:。应为
类扩展了t.A{}
在python中,我可以像这样实现我想要的

将测试导入为t
甲级(t.A):及格
在哈斯克尔,我可以做到

将合格测试导入为T
A型=T.A型

问题:在Scala中可以实现类似的功能吗?我可以做些什么来接近这个功能?

如果
test
是包的完全限定名,您根本不需要导入它。只需使用它:

A类扩展了test.A
更详细一点。在Scala中,只要在编译类路径上存在一个包,它就可以按名称使用。而决定类路径上的内容的是构建工具(或者,如果您使用命令行scalac,我不建议您这样做,但对于最琐碎的实验来说)

Scala中的导入(以及JVM中的大多数语言,如果不是所有其他语言的话)实际上并不是告诉编译器或解释器要使用哪个“模块”,就像在Python中一样。它们的主要目的是允许您使用类和对象的短名称(
Foo
bar
),而不是它们的完全限定名称(
org.example.project.Foo
org.example.project.bar


不幸的是,在Scala 2中似乎不可能对
\u root\u
命名空间中的包进行别名处理。在Scala 3
import\u root\u中{test=>t}
实际上似乎是可行的。至少在我当前使用的预览快照中是这样。

这是可行的,但我相信OP希望将
test
重命名为
t
。根据他的示例,按原样使用
test
似乎是可以接受的,但并不理想。但是重命名
test
(理想的做法)目前根本不可能。是的,我明白了,有什么理由不可能。对我来说,这听起来像一个bug,值得报告吗?我不会真的称它为bug,尽管我不确定这是一个疏忽还是故意的。但它可能仍然是一个很好的功能请求。或者只是为了发现它的意图而进行报告al与否。事实证明,这在Scala 3中实际上是可能的,因此,这可能是一种缺陷/疏忽。使用
test
作为库名称是一个坏主意。只需发明自己的域名,并将其用作库代码的前缀。作为记录,我。