web-dev-qa-db-ja.com

異なるパッケージで同じクラス名

同じクラスを複数のパッケージに含めることはできますか?つまり、Foo.Javacom.test.package1com.test.package2クラスを含めることができますか?

更新

これで、パッケージ1からクラスをコピーしてパッケージ2に配置し、そのクラスのインスタンスを作成しています。このインスタンスがパッケージ1に存在するクラスを指すようにしたいのですが、現在はパッケージ1のパスを指しているのですが、どうすれば変更できますか?

ああ、だから私は次のようなことはできません:

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

はい、複数のパッケージに同じ名前の2つのクラスを含めることができます。ただし、2つのimportステートメントを使用して同じファイルに両方のクラスをインポートすることはできません。本当に両方のクラス名を参照する必要がある場合は、クラス名の1つを完全に修飾する必要があります。


例:あるとします

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.
    }
}
41
aioobe

もちろん可能ですが、ソースファイルに両方が含まれている場合は、他のパッケージで呼び出すときにどちらを使用するかを区別する必要があります。

コメントへの応答:

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

エラーが発生したときに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;インポートの下部にあります。

3
Percy

そのため、実装されたクラスの一方または両方で完全修飾名を使用するよりも賢いソリューションを探していました。

プライベートクラスを作成し、クラスを拡張する場合、毎回完全なパッケージ名を書き込むことなく、クラスを自由に使用できます。

パッケージ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 { }
        }
    }
0
Jakob Holst