言語のこの機能を積極的に使用している人がほとんどいないと仮定しても、私はそれほど間違えません。 それが何であるか覚えていない人のために、あなたはここを読むことができます 。 練習に移します。
私は問題に出くわしました:ボタンをクリックするだけで既存のイベント(GWT)を送信する必要がありますが、送信する前に(コマンド)属性を設定します。 テンプレートはそれと何の関係があるのでしょう...
そして、ここに何があります:
ボタンを作成するためのメソッド自体は簡単で、コマンドはクラスフィールドです。
Component createEventLink(String link, final Event<?> event) { TextButton button = new TextButton(link, new SelectHandler() { @Override public void onSelect(SelectEvent e) { //event.setCommand(command); bus.fire(event); } }); return new WidgetComponent(button); }
問題は次の行にあります。
//event.setCommand(command);
Eventオブジェクトにはそのようなメソッドはありません。 解決策は明らかです。中間CommandEventクラスからイベントを継承します。このクラスはこのメソッドを持ち、Eventから継承されます。 メソッドは次のようになります。
Component createEventLink(String link, final CommandEvent<?> event) { TextButton button = new TextButton(link, new SelectHandler() { @Override public void onSelect(SelectEvent e) { event.setCommand(command); bus.fire(event); } }); return new WidgetComponent(button); }
ユーリカ? ハ! ここで、イベントの1つが別の子クラス(GwtEventなど)から既に継承されており、CommandEventクラスをまったく継承できないことがわかります。
次のステップは、setCommand()メソッドを使用してICommandEventインターフェイスを作成し、各イベントがそれを実装することです。 メソッドは次のようになります。
Component createEventLink(String link, final Event event) { TextButton button = new TextButton(link, new SelectHandler() { @Override public void onSelect(SelectEvent e) { if (event instanceof ICommandEvent) { ((ICommandEvent) event).setCommand(command); } else { throw new IllegalStateException("Only ICommandEvent allowed"); } bus.fire(event); } }); return new WidgetComponent(button); }
Wellい! さらに、任意のイベントをそこに転送できますが、起動時にのみ公開されるため、良くありません。
次に、この記事のトピック、つまりJavaの複数の境界ジェネリックを思い出してください。 それらを使用すると、メソッドは次のようになります。
<E extends Event<?> & ICommandEvent> Component createEventLink(String link, final E event) { TextButton button = new TextButton(link, new SelectHandler() { @Override public void onSelect(SelectEvent e) { event.setCommand(command); bus.fire(event); } }); return new WidgetComponent(button); }
まさに必要なもの。