0

内部にオブジェクトを含む配列があります。配列要素でメソッドを使用するにはどうすればよいですか?

私の配列はタイプObjectです。試しarray[i].getSalary()ましたが、これはうまくいきません。

4

2 に答える 2

4

まず第一に、 の配列を使用することはほとんどありませんObject。その理由は、次のすべての型情報が失われるためです。

  • あなたのコードを読む人(あなたの教授、あなた自身、そしてコードについてのすべてを忘れてしまう6ヶ月後のあなた自身を含む)にとってコードをより理解しやすくします。
  • プログラムをテストする前であっても、コンパイラと IDE が間違いを犯していることを知らせるために使用できます。
  • この回答の後半で説明する、エラーが発生しやすいタイプのキャストを回避できます。

の配列の代わりに、その中に配置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()!");
}

しかし、これがはるかに冗長になり、これらのオブジェクトのメソッドを呼び出さなければならない回数をこれに掛けると、コードが管理不能になることがわかります。

于 2013-02-07T00:46:07.550 に答える
0

内部のすべてのオブジェクトにobject[]メソッドがありgetSalary()ますか?

  • そうでない場合は、コンパイラがそれを許可しない理由が明らかにわかります。このような状況になった場合、コードのどこかでおかしなことが起こっています。

  • はいの場合、それはまったく同じgetSalary()メソッドですか、または同じクラス階層内の同じメソッドの複数の動的にバインドされた実装ですか?

    • どちらでもない場合は、おそらく、IHasSalaryそのようなメソッドを公開するインターフェイス(名前がわかりません)を作成し、これらすべてのオブジェクトにそのインターフェイスを実装させ、配列を として宣言する必要がありますIHasSalary[]

    • はいの場合、最も特殊化された共通の祖先を見つけ、それが classEmployeeであると言い、配列を として宣言しEmployee[]ます。

于 2013-02-07T01:00:57.083 に答える