介绍
从C ++开始,最大的区别之一是作用域的不同:在C ++中,每个标识符都相对于当前范围(class或namespace),您可以::在开始时使用范围解析运算符编写一个绝对路径。
但是,在Java中,如果不将标识符导入当前作用域或编写其完整路径,就无法找到从其他包访问标识符的方法。
如果我有几个同名的类,那么这可能是一个问题(然后,在C ++中,我将它们分别命名为Module1 :: Foo和Module2 :: Foo,这在Java中是不可能的,只要我想保持理智即可。因为com.company.project.module1.Foo对于我的品味来说太长了)。
代码!
这是一个Tools.Useless.Foo从Java和C ++访问类的示例(不带import或using)
Tools/Useless/Foo.hpp:
namespace Tools {
namespace Useless {
class Foo {
};
}
}
Tools/Bar.hpp
namespace Tools {
...
// Use Foo with a relative identifier
Useless::Foo foo;
// Use Foo with an absolute identifier.
::Tools::Useless::Foo bar;
...
}
这就是在Java中的样子:
com/company/project/Tools/Useless/Foo.java:
package com.company.project.Tools.Useless;
public class Foo { }
com/company/project/Tools/Bar.java:
...
// Use Foo with a relative identifier
???
// Use Foo with an absolute identifier.
com.company.project.Tools.Useless.Foo foo;
...
有没有一种方法可以Foo
从软件包中访问Tools.Useless
而无需指定Tools.Useless
完整的软件包名称(并导入它;因为导入会将其绑定到当前作用域)?
我做对了吗?我应该如何使用几个同名的类?我应该避免这种情况,还是只使用“ package。*”将其导入以绕过它?
使用更多的包描述类名(例如ToolsUselessFoo
而不是Foo
)。
使用import path.to.module.*
而不是导入所有内容,import path.to.module.Foo
然后访问Foo
所需的软件包以解决任何歧义。问题在于有时包名称具有含义(例如Tools.Useless.Foo
和Tools.Useful.Foo
)。
相关分类