Одинаковое имя класса в разных пакетах - PullRequest
15 голосов
/ 30 октября 2010

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

Ответы [ 3 ]

33 голосов
/ 30 октября 2010

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

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

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

com.test.package1.Foo myFoo = new com.test.package1.Foo();
com.test.package2.Foo myOtherFoo = new com.test.package2.Foo();
2 голосов
/ 22 апреля 2015

Я был доставлен на эту страницу 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; в нижней части моего импорта.

...