[解決済み] メソッドの戻り値の型を汎用的にするにはどうすればよいですか?
2022-03-15 13:33:51
質問
この例(OOPの本で典型的なもの)を考えてみましょう。
私は
Animal
クラスで、それぞれの
Animal
は多くの友人を持つことができます。
といったサブクラスがあります。
Dog
,
Duck
,
Mouse
など、特定の動作を追加するものです。
bark()
,
quack()
などです。
ここでは
Animal
クラスがあります。
public class Animal {
private Map<String,Animal> friends = new HashMap<>();
public void addFriend(String name, Animal animal){
friends.put(name,animal);
}
public Animal callFriend(String name){
return friends.get(name);
}
}
そして、以下はタイプキャストを多用したコード・スニペットです。
Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());
((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();
戻り値の型にジェネリックスを使用して、型キャストをなくす方法はないでしょうか。
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
以下は、戻り値の型がパラメータとしてメソッドに伝達され、決して使用されない初期コードです。
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
を使用して、余分なパラメータを使わずに実行時に戻り値の型を把握する方法はありますか?
instanceof
? あるいは、少なくともダミーインスタンスの代わりに、その型のクラスを渡すことによって。
ジェネリックはコンパイル時の型チェックのためと理解していますが、回避策はあるのでしょうか?
解決方法は?
を定義することができます。
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();
このコードには、コンパイラの警告を発生させないという利点があります。もちろん、これはGeneric以前のキャスティングのバージョンを更新したに過ぎず、安全性を追加するものではありません。
関連
-
JDKの設定時にjava.dllが見つからない、java SE Runtime Environmentが見つからない問題が発生しました。
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] Javaで汎用配列を作成する方法は?
-
[解決済み] 汎用型Tのクラスインスタンスを取得する方法を教えてください。
-
[解決済み] 汎用クラスやメソッドのメンバからTの型を取得する方法
-
[解決済み] C#でジェネリックメソッドからNULLを返すにはどうしたらいいですか?
-
[解決済み】TをEnumに拘束するGenericメソッドの作成
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
プロローグでのコンテンツは禁止されています
-
Spring BootのテストメソッドFailed to load ApplicationContextの問題を解決する
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
javaでクラスを作成すると、enclosing classでないように見える
-
HttpClientがGZIP形式でない場合の対処法
-
java 例外。Javaツールの初期化
-
JSPで「リストが型解決できない!」の解決方法
-
[解決済み] オーバーライドされたメソッドは、戻り値の型を変えることができますか?