0

私のメソッドは、入力としてオブジェクトを受け取ります。タイプを判別し、それに応じてキャストするにはどうすればよいですか?

したがって、たとえば:binarySearch( Object o );

binarySearchメソッド内で、オブジェクトoのタイプ(またはクラス)を判別する方法が必要です。次に、そのタイプでキャストする必要があります。どのように私はそれをしますか?

より具体的には、オブジェクトoは基本クラスの子であり(EG SalariedEmpはEmployeeの子です)、特に基本クラスが必要です。

編集:私は自分がやりたいことをどのように行うかを考え出しました。これはまったく別の質問になるはずです。fromの.compareToメソッドを使用してComparable、それらのオブジェクトのプライベートデータに基づいて2つのオブジェクトを比較する方法を設定する必要がありました。私がしなければならなかったのは、implementsキーワードを使用してクラスを「Comparable」として実装することだけでした。したがって、binarySearchメソッドで比較されるオブジェクトのタイプに関係なく、それらが同じ(不明な)タイプであり、Comparableが実装されている場合は機能します。これにより、binarySearchメソッドは、あらゆるタイプの同等のクラスで非常に再利用可能になります。

したがって、公平を期すために、元の質問をカバーする回答を受け入れます。

:)

4

3 に答える 3

3
if (o instanceof SalariedEmp)
    doSomethingWith((SalariedEmp)o);
于 2010-12-08T01:27:31.070 に答える
3

これを行う2つの方法:

  1. 演算子を使用しinstanceofます。

  2. オブジェクトを呼び出しgetClass()ます(最初にnullを確認してください)。

于 2010-12-08T01:36:37.553 に答える
3

インスタンスのinstanceof演算子を使用するか、インスタンスで.getClass()を呼び出すことにより、RTTI(Run-Time Type Identification)を使用できますが、これはほとんどの場合、使用しているスーパータイプが間違ったスーパータイプであることを示しています。またはひどく設計されています。

あなたの場合、少なくとも従業員がいることをすでに知っているので、オブジェクトを使用する必要はありません。

オブジェクト指向のパラダイムは、オブジェクトインスタンスにそれが何であるかを尋ねるのではなく、何かをするように求めるというものです。この場合、Employeeオブジェクトに実行を依頼する可能性のあるいくつかのことを選択できます。どちらが最適かは、モデル化しようとしているものによって異なります。

boolean isSalaried()Employee基本クラスに仮想メソッドを追加することで、給与が支払われるかどうかを尋ねてから、キャストすることができます。基本メソッドはfalseを返しますが、SalariedEmployeeはそのメソッドをオーバーライドしてtrueを返します。

しかし、それは(おそらくより高価な)RTTIを回避しますが、キャストを回避しません。メソッドSalariedEmployeeasSalariedEmployee()を追加できます。このメソッドは、基本クラスではnullを返し、SalariedEmployeeでは。を返しthisます。これにより「安全な」キャストが得られますが、それでもnullに対するテストが必要です。

または、Money getSalary()メソッドをEmployeeに追加することもできます。これで、キャスティングを行う必要はありませんが、給与のない従業員の給与を決定する必要があります。これは、null、ゼロ、またはNaN(特別なNot a Number値)である可能性があります。

nullを返すことにした場合、場合によっては(たとえば、値を追加する)nullに対してテストする必要があり、他の場合(たとえば、給与を.equals()に渡す)では、nullに対してテストする必要はありません。 Object.equals()の指定により、instance.equals(null)はfalseを返す必要があります。

ゼロを返す場合、nullに対してテストせずに追加できますが、等しいは少し奇妙かもしれません-それぞれが給与を受け取らない2人の時間給労働者が同じ(存在しない)給与を持っているというのは本当に本当ですか?それはあなたがモデリングしているものに依存します。trueの場合、ゼロを返します。

2人の時間給労働者が同じ存在しない給与を持っていることが真実でない場合は、NaN値を返します。これは、「NullObjectPattern」の特定のケースです。

于 2010-12-08T01:45:56.783 に答える