在Scala vs Java中导入类优先级

时间:2019-04-12 10:41:50

标签: java scala

由于导入类问题,我被卡住了。 就我而言,我的类与Apache Common StringUtils有依赖关系,并且在同一包中有一个相同的名称类(StringUtils)。 (Main类与Apache Common的StringUtils有依赖关系,并且与Main类在同一包中有一个StringUtils。但这是编译错误)

enter image description here

我使用导入语法指定了Apache common的StringUtils,但似乎被同一软件包的StringUtils所遮盖。 是scala的语言规范吗?

在Java中,没有问题。它与Apache common的StringUtils一起使用。 enter image description here

4 个答案:

答案 0 :(得分:6)

我建议您简单地使用scala中的功能来创建“别名”,例如:

import users.{UserPreferences => UPrefs}  // import and rename for convenience

(来自scala-lang.org

换句话说:通过以其他名称导入库类,只需避免该类名称的隐蔽。

答案 1 :(得分:5)

您可以使用完全限定的名称来使用Apache的StringUtils。

println(org.apache.commons.lang3.StringUtils.isEmpty(""))

答案 2 :(得分:2)

那是因为您的编译器使用它可以找到的最接近的类来表示StringUtils。它既可以是您在代码中写的,也可以是org.apache中的一个,但谁知道呢?您自己甚至可能在某个时候不确定!所以你必须澄清一下。

一个类实际上是使用整个程序包名称定义的,当您进行导入时,它仅允许您使用快捷方式StringUtils而不是org.apache.commons.lang3.StringUtils。 >

为解决该问题,有几种选择:

  • 使用import org.apache.commons.lang3.StringUtils._进行静态导入:您可以在此处直接调用方法isEmpty,但编译器不会说出StringUtils
  • 在通话中使用全名:println(org.apache.commons.lang3.StringUtils.isEmpty(...))这样,就不会造成混淆
  • 在Scala中,您可以定义同盟军。为此,您有两个选择。在导入时间:import org.apache.commons.lang3.{StringUtils => ApacheStringUtils}或在课堂上:type ApacheStringUtils = org.apache.commons.lang3.StringUtils。对于这种情况,选项“在导入时”会稍微方便一些,甚至可能更有效(您可以替换运行时在代码中定义的类型)。

我个人更喜欢选项3.1(在导入时创建别名时)。这样,您的代码更加清晰,您可以从StringUtils调用任何函数。

答案 3 :(得分:1)

另一种选择是导入StringUtils的所有成员(类似于Java中的静态导入):

org.apache.commons.lang3.StringUtils._

然后您就可以直接调用方法:

println(isEmpty(""))