Одно и то же имя класса в разных пакетах

Может ли такой же класс существовать в нескольких пакетах? Другими словами, могу ли я иметь класс dummy.java в com.test.package1 и com.test.package2?

Обновление

Теперь я скопировал класс из пакета 1 и поместил его в пакет 2, и теперь я создаю экземпляр этого класса, я хочу, чтобы этот экземпляр указывал на класс, присутствующий в пакете 1, но в настоящее время он указывает путь пакета1, как я могу изменить это?

Так что я не могу сделать что-то вроде:

Foo = new Foo() //pointing to 1 package Foo class
Foo = new Foo() // pointing to 2 package Foo class

Ответ 1

Да, вы можете иметь два класса с одинаковым именем в нескольких пакетах. Однако вы не можете импортировать оба класса в один и тот же файл, используя два оператора 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.
    }
}

Ответ 2

Несомненно, но вам нужно будет отличить тот, который вы хотите, когда вызываете их в других пакетах, если оба включены в исходный файл.

Ответ на комментарий:

com.test.package1.Foo myFoo = new com.test.package1.Foo();
com.test.package2.Foo myOtherFoo = new com.test.package2.Foo();

Ответ 3

i был отправлен на эту страницу google, когда у меня была ошибка 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; внизу моего импорта.

Ответ 4

Поэтому я искал более разумное решение, чем просто использование полностью определенных имен в одном или обоих реализованных классах.

Если вы создаете закрытый класс и расширяете свой класс, вы можете использовать этот класс, не записывая полное имя пакета каждый раз.

Пакет 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 { }
        }
    }