異なるデータ型の要素をJavaの単一のスタックに挿入するにはどうすればよいですか?要素のスタック
要素のスタック
答えて
genericsの目的を無効にするようだが、ここではそれが行く:
Stack<Object>s = new Stack<Object>();
s.add("hello");
s.add(1); // int is autoboxed to Integer
キャッチがStack
からObject
Sを取得するとき、どのような種類を見つけるためにいくつかの努力が必要になるだろうということになります各要素である - それはinstanceof
と型キャストを使用して必要になります。
while (!s.isEmpty()) {
Object e = s.pop();
if (e instanceof String)
System.out.println("String: " + (String)e);
else if (e instanceof Integer)
System.out.println("Integer: " + (Integer)e);
else
System.out.println("Other type: " + e);
}
そして今、我々は5日、ジェネリック医薬品の前に前のJavaの脆弱なコードに似た何かを言語に追加されたています。
一般的に、継承を使用してこれを解決する必要があります。おそらくマーカーインターフェイスを使用して:あなたは、単一のクラスでのインターフェイスの数に制限を実装することができ、あなたはどこにでもクラスhierchyで余分なインターフェイスを追加することができますので、
interface MyMarker
{
}
class Foo implements MyMarker
{
}
class Bar implements MyMarker
{
}
インタフェースは、このようなケースでは実用的です。あなたはその後、同じスタック内のFooとバーを置くことができ
は:
Stack<MyMarker> s = new Stack<MyMarker>();
s.add(new Foo());
s.add(new Bar());
これは、それがすべてで可能かどう移動するための方法です。それ以外の場合は、coobirdが示唆するようにしなければなりません。
これは間違いなく良い方法です - "instanceof"のif-elseifラダーがある場合、その解決策は通常継承されます。 – coobird
スタックの汎用引数は、すべての要素ランタイム型の共通のスーパータイプである必要があります。完全に異種のコレクションの場合、Object
はすべての参照タイプの共通のスーパータイプです。だから、:
Queue<Object> stack = Collections.asLifoQueue(new ArrayDeque<Object>());
stack.add("red");
stack.add(Color.GREEN);
stack.add(stack);
はもちろん、あなたがスタックからそれらの要素をポップに来たとき、あなたは(そしておそらくキャスト)適切なコードにルーティングするチェックinstanceof
を行う必要があります。
間接参照のレイヤーを導入する方がよいでしょう。オブジェクトをキューに直接置くのではなく、意味のあるオブジェクトにラップしてください。 instanceof
チェックはすべて、必要な操作を実行する(仮想)メソッドへの呼び出しで置き換えることができます。多形性がどのようになっているのか。
- 1. 上の擬似要素のスタックの親
- 2. Pythonのスタック重複要素の累積
- 3. スタック上の要素の逆順
- 4. スタック内の要素の移動
- 5. スタックされたHTML要素の順序
- 6. 2番目の要素を最初にスタックし、次に3番目の要素をスタックします。
- 7. スタック内のキューの要素を挿入するjava
- 8. スタックの一番上の要素を複製します。Java
- 9. ベクトルの要素をC++のスタックにコピーする方法
- 10. スタック可能なメニューのすぐ隣に要素を配置
- 11. スタック内の最も複雑なスワップ要素
- 12. ランダム配列の要素を交換すると、配列がスタック
- 13. イベントの伝達を防ぐスタックされた要素
- 14. ルビーの要素に基づいてスタックを比較する
- 15. オーバーレイ/カバー/スタックされた要素のJavascriptマウスイベント
- 16. 印刷値が前にスタック内の要素[パイソン]
- 17. 文字列要素でJavaスタックを使用する
- 18. 擬似要素にdiv、z-index、box-shadowをスタックした
- 19. スタックする要素を取得できません。
- 20. スタックは同じ要素をポップし続けます
- 21. C#削除可能要素を持つスタック
- 22. スタックされた要素をブーストラップとCSSのスプライト要素に合わせる方法
- 23. ヘッドラインの背後にある擬似要素のスタック(ボックスシャドウの代替)
- 24. リストのすべての要素をスカラーでスタックするようにプッシュ
- 25. スタックの一番上の要素を一番下にスワップする方法
- 26. ブレード - ブレードテンプレートのスタックの先頭に要素を追加する方法は?
- 27. スタックの最後の要素をポップした後にプログラムがクラッシュする
- 28. jQueryカスタムフィルタの問題:要素のスタックがあまりにも多い
- 29. Fisher-Yatesのシャッフル時にJavaスタックに残っている要素は?
- 30. Javascript 1つのテキストエリアに要素IDスタック出力を取得する
危険性は、後でアイテムを取得するときに、オブジェクトタイプのチェックを書く必要があります。 – Joset
絶対に - 私はちょうど編集としてその部分を追加し終えました。 – coobird