内部にオブジェクトを含む配列があります。配列要素でメソッドを使用するにはどうすればよいですか?
私の配列はタイプObject
です。試しarray[i].getSalary()
ましたが、これはうまくいきません。
まず第一に、 の配列を使用することはほとんどありませんObject
。その理由は、次のすべての型情報が失われるためです。
の配列の代わりに、その中に配置Object
されるオブジェクトの型に対応する型の配列 (または共通の基本クラス) を使用します。あなたのクラスが呼び出されたと仮定するとEmployee
、次のように配列を宣言する必要があります。
Employee[] employeeArray;
(これも読みやすさのために、含まれているオブジェクトの種類をemployeeArray
示すよりも適切な名前です。一般に、変数には明示的な名前を使用します。)array
employeeArray[i].getSalary()
クラスEmployee
にそのようなメソッドが含まれている場合、そのソリューションを使用するのは簡単です。このコードの意図は、読んでも明らかです。
その他の可能性は、必要に応じて、List<Employee>
またはのような一般的なコレクションです。Set<Employee>
本当に Object の配列を使用しgetSalary()
てメソッドを呼び出す必要がある場合は、メソッドが属するクラスまたはインターフェイスに配列要素をキャストする必要があります。getSalary()
たとえば、このクラスが呼び出された場合Employee
:
Employee employee = (Employee) array[i];
employee.getSalary();
キャストとは、オブジェクトのタイプ Employee の参照を取得することです。オブジェクトは同じままですがEmployee
、このオブジェクトのメソッドを呼び出すことができるようになりました。
ただし、このソリューションにはいくつかの注意点があります。第 1 に、より冗長であり、1 行で済みそうなものを作成するのに 2 行必要です。第 2 に、さらに重要なことは、 の配列がObject
あるため、タイプ のオブジェクトが実際にあると確信できません。そうEmployee
でない場合、操作は をスローしClassCastException
ます。これに対する解決策は、オブジェクトが実際に目的のタイプであることを最初に確認することです。
Object object = array[i];
if (object instanceof Employee) {
Employee employee = (Employee) object;
employee.getSalary();
}
else {
System.err.println("Object is not an Employee: we can not call getSalary()!");
}
しかし、これがはるかに冗長になり、これらのオブジェクトのメソッドを呼び出さなければならない回数をこれに掛けると、コードが管理不能になることがわかります。
内部のすべてのオブジェクトにobject[]
メソッドがありgetSalary()
ますか?
そうでない場合は、コンパイラがそれを許可しない理由が明らかにわかります。このような状況になった場合、コードのどこかでおかしなことが起こっています。
はいの場合、それはまったく同じgetSalary()
メソッドですか、または同じクラス階層内の同じメソッドの複数の動的にバインドされた実装ですか?
どちらでもない場合は、おそらく、IHasSalary
そのようなメソッドを公開するインターフェイス(名前がわかりません)を作成し、これらすべてのオブジェクトにそのインターフェイスを実装させ、配列を として宣言する必要がありますIHasSalary[]
。
はいの場合、最も特殊化された共通の祖先を見つけ、それが classEmployee
であると言い、配列を として宣言しEmployee[]
ます。