戻り値の型のジェネリックスによる型キャストの克服
OOP プログラミングでは、クラスは関連オブジェクトのコレクションを維持することがよくあります。たとえば、Animal クラスは、Dog や Duck などのさまざまなサブクラスのインスタンスである可能性のある友人のリストを追跡する場合があります。
伝統的に、このリストから特定の友人を取得するには、クラスの異質な性質のため、型キャストが必要です。コレクション。これにより、次のようなコードが生成されます。
Mouse jerry = new Mouse(); jerry.addFriend("spike", new Dog()); jerry.addFriend("quacker", new Duck()); ((Dog) jerry.callFriend("spike")).bark(); ((Duck) jerry.callFriend("quacker")).quack();
この面倒な型キャストを回避するには、ジェネリックスを使用して callFriend メソッドの戻り値の型を正しいサブクラスに固有にすることを検討してください。ただし、この特定のシナリオでは、
public <T extends Animal> T callFriend(String name, T unusedTypeObj) { return (T)friends.get(name); }
のようなパラメーターとして戻り値の型を指定しても、未使用の型パラメーターは実行時に追加情報を提供しないため役に立ちません。
代わりに、次の回避策を使用します。必要な型のクラスを引数として callFriend に渡す必要があります:
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();
このソリューションは実行時の型キャストを排除し、返されたオブジェクトを目的のサブクラスに安全にキャストできるようにします。
以上が異種コレクションからオブジェクトを取得する際、ジェネリックスはどのようにして型キャストを排除できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。