Java のジェネリック戻り型
Java では、ジェネリックはタイプセーフなコードを作成するための強力なツールです。ただし、汎用の戻り値の型の問題は、特に動作が異なるクラスの階層を扱う場合に問題を引き起こす可能性があります。この記事では、この問題を調査し、明示的な型キャストの必要性を排除する解決策を提供します。
この問題は、基本クラス (Animal など) とそのサブクラス (Dog、Duck、Mouse など) を操作するときに発生します。提供された例では、基本クラス Animal は、Animal オブジェクトを返すメソッド callFriend を定義します。ただし、実際には、Dog の bark() や Duck の quack() など、サブクラスに固有のメソッドを呼び出したい場合があります。
手動の型キャストの必要性を避けるために、汎用の return を定義できます。 callFriend メソッドの型:
public <T extends Animal> T callFriend(String name) { return (T) friends.get(name); }
このソリューションは、予期される戻り値の型をコンパイラーに伝えますが、未使用のパラメーターunusedTypeObjが導入されます。これに対処するには、目的の戻り値の型を表す Class オブジェクトを受け入れるようにメソッドを変更します:
public <T extends Animal> T callFriend(String name, Class<T> type) { return type.cast(friends.get(name)); }
その後、メソッドを呼び出して、引数として特定のサブクラスを指定できます:
jerry.callFriend("spike", Dog.class).bark(); jerry.callFriend("quacker", Duck.class).quack();
このソリューションにより、明示的な型キャストの必要性が回避され、コードの型安全性が向上します。ただし、このアプローチでは、指定された Class オブジェクトが Animal の有効なサブクラスであることをコンパイラが検証する必要があるため、いくつかの制限が課される可能性があることに注意することが重要です。それにもかかわらず、これは Java で汎用の戻り値の型を処理する柔軟かつ効果的な方法を提供します。
以上がJava でジェネリック戻り型を使用した明示的な型キャストを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。