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