次の理由は、従来のキャスト方法よりも優れています。Javaジェネリック
MyObj obj = someService.find(MyObj.class, "someId");
対
MyObj obj = (MyObj) someService.find("someId");
次の理由は、従来のキャスト方法よりも優れています。Javaジェネリック
MyObj obj = someService.find(MyObj.class, "someId");
対
MyObj obj = (MyObj) someService.find("someId");
明示的な型パラメータを使用するもう1つの利点は、Proxy
(この場合はMyObj
はMyInterface
である必要があります)を使用してサービスメソッドを実装できるようにすることです。明示的な型パラメータがなければ、これは不可能です。
あなたはそれが良いではない多くの理由(いずれかのテスト)
あなたはClassCastExceptionが発生する可能性がありますので、非ジェネリックバージョンは、タイプの「このmyobj」オブジェクトを返すという保証はありません。
ケース1の場合、ID someId
のタイプがMyObj
のオブジェクトが見つからない場合、最もよく実装されたサービスはnullを返すことができます。さらに、最初のケースでは、サービスがタイプMyObj
のクラスでの作業に特有の特定のロジックを持つことが可能になりました。
ケース2の場合、instanceofを使用しない限り(可能な場合は避けてください)、あなたはキャッチして扱わなければならない醜いClassCastException
の危険性があります。最初のシナリオが優れている理由を
一つの理由は、find(Class,String)
方法は今その戻り値が割り当てられているかの知識を持っていることです。したがって、正しい型が返されることを期待するのではなく、内部的に関連するキャストを実行できるようになりました。例えば、find
メソッドが、"someId"
で呼び出されたときにString
オブジェクトを内部的に探し出すとします。 find
メソッドは、String
をMyObj
インスタンスにキャストするための戦略を持つ場合があります。
のためにカバーの下にProxy
を使用する場合があります。おそらく非常に特殊な状況を除いて悪化します。ファクトリメソッドとスタッフ - あなたがそういったことを必要とするだけの時間は、ターゲットがクラスオブジェクトでのnewInstance()(など)を呼び出す必要があるとしているところです。
あなたは電子を保存したい場合は、ところで、これはまた、これが優れていると言う
MyObj obj = someService.find((Class<MyObj>) null, "someId");
に動作しますか? – Milhous