不同包中的相同类名

时间:2010-10-29 20:27:59

标签: java packages

多个包中是否存在同一个类? 换句话说,我可以在dummy.javacom.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

4 个答案:

答案 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 { }
        }
    }