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

java - 在scala vs java中导入类优先级-LMLPHP

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

在Java中,没有问题。它与Apache common的StringUtils一起使用。
java - 在scala vs java中导入类优先级-LMLPHP

最佳答案

那是因为您的编译器使用它可以找到的最接近的类来表示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调用任何函数。

10-07 12:57