同じクラスを複数のパッケージに含めることはできますか?つまり、Foo.Java
とcom.test.package1
にcom.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
はい、複数のパッケージに同じ名前の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.
}
}
もちろん可能ですが、ソースファイルに両方が含まれている場合は、他のパッケージで呼び出すときにどちらを使用するかを区別する必要があります。
コメントへの応答:
com.test.package1.Foo myFoo = new com.test.package1.Foo();
com.test.package2.Foo myOtherFoo = new com.test.package2.Foo();
エラーが発生したときに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;
インポートの下部にあります。
そのため、実装されたクラスの一方または両方で完全修飾名を使用するよりも賢いソリューションを探していました。
プライベートクラスを作成し、クラスを拡張する場合、毎回完全なパッケージ名を書き込むことなく、クラスを自由に使用できます。
パッケージ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 { }
}
}