我因导入类问题而被卡住。
就我而言,我的类与Apache Common StringUtils
有依赖关系,并且在同一包中有一个相同的名称类(StringUtils
)。 (Main类与Apache Common的StringUtils
有依赖关系,并且与Main类在同一包中有一个StringUtils。但这是编译错误)
我用导入语法指定了Apache common的StringUtils
,但是似乎被同一包的StringUtils
遮盖了。
是scala的语言规范吗?
在Java中,没有问题。它与Apache common的StringUtils一起使用。
最佳答案
那是因为您的编译器使用它可以找到的最接近的类来表示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
调用任何函数。