2016-12-29 7 views
0

私は、オブジェクトをMap<String, Command>に追加し、このコマンドに関連するクラスを書くことによって、新しいコマンドを追加することをサポートするjavaでシェル実装を書いています。java:動的クラスキャスト

commandList.put("sort", new sort()); // sort extends Command 

各コマンドはConsumer<T>オブジェクト(Tコマンドのクラスである:例えばソート)を用いる方法基準にオプション名を関連付けた複数OptionsDefinition<T> Sを有しています。

私は私がタイプsortthisを渡す必要があるために、非静的を参照する方法は同じコマンドの属性の値を混合せずに自分の殻に二度同じコマンドを呼び出すことができるようにしたいですmy sortコマンドの例ではConsumer<sort>です。

私は私が持っているもの変換することができます方法を知りたい:それに

Command sort = commandList.getCommand("sort"); 

sort sort = commandList.getCommand("sort"); 

option.getCallback().process(sort); // sort is the reference to this 

を使用できるようにするには、行うことが可能ですそう ?

+0

「ソート」の実装が1つしかない場合は、その1つの実装を使用するだけで、ルックアップする必要はありません。実装が複数ある場合は、キャストを使用します。 –

答えて

1

暗黙のキャストを使用してgetCommandを実装できます。

public <C extends Command> C getCommand(String name) { 
    return (C) commands.get(name); 
} 

次にあなたが

Sort sort = commandMap.getCommand("sort"); 

ノート書くことができます。

  • クラスがタイトルケース
  • にリストされている以外、負の数で発注し、インデックス化コレクションです。 Javaでは、キーでインデックス付けされたコレクションMapを呼び出します。
  • キャストが安全かどうかをコンパイラが知らないため、このメソッドでキャスト警告がチェックされません。これを無効にするためにできることは、次のとおりです。

警告を抑制するには。

+0

'return(C)commands.get(name);'を実行するときに、チェックされていないキャストに関する警告が出ます。 – MaxV37

+0

@ MaxV37はい。コンパイラはキャストが安全であることを知らない。あなただけ。 –

+0

@ MaxV37警告を抑制することができます。上記を参照してください。 –

関連する問題