[解決済み] 2つの汎用型と1つのインタフェースを実装したJavaクラスを作るには?
2022-04-22 03:53:35
質問
一般的なインターフェイスがあります
public interface Consumer<E> {
public void consume(E e);
}
2種類のオブジェクトを消費するクラスがあるので、次のようなことをしたいと思います。
public class TwoTypesConsumer implements Consumer<Tomato>, Consumer<Apple>
{
public void consume(Tomato t) { ..... }
public void consume(Apple a) { ...... }
}
どうやら私には無理なようです。
もちろん、ディスパッチを自分で実装することは可能です。
public class TwoTypesConsumer implements Consumer<Object> {
public void consume(Object o) {
if (o instanceof Tomato) { ..... }
else if (o instanceof Apple) { ..... }
else { throw new IllegalArgumentException(...) }
}
}
しかし、私はジェネリックが提供するコンパイル時の型チェックとディスパッチの解決策を探しているのです。
私が思いつく最良の解決策は、例えば、別々のインターフェイスを定義することです。
public interface AppleConsumer {
public void consume(Apple a);
}
機能的には、この解決策でOKだと思います。ただ、冗長で醜いだけです。
何かアイデアはありますか?
解決方法は?
カプセル化を検討する。
public class TwoTypesConsumer {
private TomatoConsumer tomatoConsumer = new TomatoConsumer();
private AppleConsumer appleConsumer = new AppleConsumer();
public void consume(Tomato t) {
tomatoConsumer.consume(t);
}
public void consume(Apple a) {
appleConsumer.consume(a);
}
public static class TomatoConsumer implements Consumer<Tomato> {
public void consume(Tomato t) { ..... }
}
public static class AppleConsumer implements Consumer<Apple> {
public void consume(Apple a) { ..... }
}
}
これらの静的な内部クラスを作成するのが面倒な場合は、匿名クラスを使用することができます。
public class TwoTypesConsumer {
private Consumer<Tomato> tomatoConsumer = new Consumer<Tomato>() {
public void consume(Tomato t) {
}
};
private Consumer<Apple> appleConsumer = new Consumer<Apple>() {
public void consume(Apple a) {
}
};
public void consume(Tomato t) {
tomatoConsumer.consume(t);
}
public void consume(Apple a) {
appleConsumer.consume(a);
}
}
関連
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Javaで汎用配列を作成する方法は?
-
[解決済み] 汎用型Tのクラスインスタンスを取得する方法を教えてください。
-
[解決済み] C#のリフレクションで型がインターフェースを実装しているかどうかを判断する方法
-
[解決済み] メソッドの戻り値の型を汎用的にするにはどうすればよいですか?
-
[解決済み] Mapを実装し、挿入順序を保持するJavaクラス?
-
[解決済み】クラスとインターフェイスを持つJavaジェネリック - Together
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
プロローグでのコンテンツは禁止されています
-
JDKの設定時にjava.dllが見つからない、java SE Runtime Environmentが見つからない問題が発生しました。
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
Javaエラーメッセージがenclosingクラスでない
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
このラインで複数のマーカーを解決する方法