由于导入类问题,我被卡住了。
就我而言,我的类与Apache Common StringUtils
有依赖关系,并且在同一包中有一个相同的名称类(StringUtils
)。 (Main类与Apache Common的StringUtils
有依赖关系,并且与Main类在同一包中有一个StringUtils。但这是编译错误)
我使用导入语法指定了Apache common的StringUtils
,但似乎被同一软件包的StringUtils
所遮盖。
是scala的语言规范吗?
答案 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(...))
这样,就不会造成混淆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(""))