多个包中是否存在同一个类?
换句话说,我可以在dummy.java
和com.test.package1
中使用com.test.package2
课吗?
更新
现在我从package1复制了类并放入了包2,现在我正在创建该类的实例,我希望这个实例指向包1中的类,但是当前它指向package1路径,我该如何修改它?
哦,所以我做不了类似的事情:
Foo = new Foo() //pointing to 1 package Foo class
Foo = new Foo() // pointing to 2 package Foo class
答案 0 :(得分:30)
是的,您可以在多个包中拥有两个具有相同名称的类。但是,无法使用两个import
语句导入同一文件中的两个类。如果你真的需要引用它们,你必须完全限定其中一个类名。
示例:假设您有
<强>的pkg1 / SomeClass.java 强>
package pkg1;
public class SomeClass {
}
<强>则pkg2 / SomeClass.java 强>
package pkg2;
public class SomeClass {
}
和 Main.java
import pkg1.SomeClass; // This will...
import pkg2.SomeClass; // ...fail
public class Main {
public static void main(String args[]) {
new SomeClass();
}
}
如果您尝试编译,您将获得:
$ javac Main.java
Main.java:2: pkg1.SomeClass is already defined in a single-type import
import pkg2.SomeClass;
^
1 error
然而确实编译:
import pkg1.SomeClass;
public class Main {
public static void main(String args[]) {
new SomeClass();
new pkg2.SomeClass(); // <-- not imported.
}
}
答案 1 :(得分:4)
当然,如果两者都包含在源文件中,您需要在其他包中调用它们时需要区分哪一个。
对评论的回应:
com.test.package1.Foo myFoo = new com.test.package1.Foo();
com.test.package2.Foo myOtherFoo = new com.test.package2.Foo();
答案 2 :(得分:2)
当我收到错误a type with the same simple name is already defined by the single-type-import
时,我被谷歌带到了这个页面。我修复了这个错误(非常长的时间),意识到行import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
已经潜入我的导入的最顶层,而我的导入底部有import org.apache.commons.codec.binary.Base64;
行。
答案 3 :(得分:0)
因此,我在寻找一种更智能的解决方案,而不仅仅是在一个或两个已实现的类上使用完全限定的名称。
如果创建私有类并扩展类,则可以自由使用该类,而不必每次都写完整的程序包名称。
套餐1
namespace namespace1.Logger
{
public class Log
{
public void Foo1(){}
}
}
套餐2
namespace namespace2.Logger
{
public class Log
{
public void Foo2(){}
}
}
我的课堂实现
//using namespace1.Logger;
//using namespace2.Logger;
namespace MyProject
{
public class MyClass
{
public MyClass()
{
LoggerA a = new LoggerA();
LoggerB b = new LoggerB();
a.Foo1();
b.Foo2();
}
private class LoggerA : namespace1.Logger.Log { }
private class LoggerB : namespace2.Logger.Log { }
}
}