2009-02-23 13 views
5

次の理由は、従来のキャスト方法よりも優れています。Javaジェネリック

MyObj obj = someService.find(MyObj.class, "someId");

MyObj obj = (MyObj) someService.find("someId");

+1

に動作しますか? – Milhous

答えて

4

明示的な型パラメータを使用するもう1つの利点は、Proxy(この場合はMyObjMyInterfaceである必要があります)を使用してサービスメソッドを実装できるようにすることです。明示的な型パラメータがなければ、これは不可能です。

あなたはそれが良いではない多くの理由(いずれかのテスト)

9

あなたはClassCastExceptionが発生する可能性がありますので、非ジェネリックバージョンは、タイプの「このmyobj」オブジェクトを返すという保証はありません。

6

ケース1の場合、ID someIdのタイプがMyObjのオブジェクトが見つからない場合、最もよく実装されたサービスはnullを返すことができます。さらに、最初のケースでは、サービスがタイプMyObjのクラスでの作業に特有の特定のロジックを持つことが可能になりました。

ケース2の場合、instanceofを使用しない限り(可能な場合は避けてください)、あなたはキャッチして扱わなければならない醜いClassCastExceptionの危険性があります。最初のシナリオが優れている理由を

3

一つの理由は、find(Class,String)方法は今その戻り値が割り当てられているかの知識を持っていることです。したがって、正しい型が返されることを期待するのではなく、内部的に関連するキャストを実行できるようになりました。例えば、findメソッドが、"someId"で呼び出されたときにStringオブジェクトを内部的に探し出すとします。 findメソッドは、StringMyObjインスタンスにキャストするための戦略を持つ場合があります。

0

のためにカバーの下にProxyを使用する場合があります。おそらく非常に特殊な状況を除いて悪化します。ファクトリメソッドとスタッフ - あなたがそういったことを必要とするだけの時間は、ターゲットがクラスオブジェクトでのnewInstance()(など)を呼び出す必要があるとしているところです。

あなたは電子を保存したい場合は、ところで、これはまた、これが優れていると言う

MyObj obj = someService.find((Class<MyObj>) null, "someId");