これは私を困惑させます:)コードは機能しているので、より精神的な課題です。GWT TabBar で個々のタブのスタイルを設定しようとしています。このウィジェットのセットアップは少し独特です。Tab クラスは、TabBar クラス内の内部インターフェイスとして定義され、TabBar 内の ClickDelegatePanel と呼ばれる内部クラスによって実装されます。TabBar の完全なコードはこちら
重要なビット (私が思うに!) はインターフェイスです。
public interface Tab extends HasAllKeyHandlers, HasClickHandlers, HasWordWrap {
そして実装…
private class ClickDelegatePanel extends Composite implements Tab {
スタイルを追加するメソッドは、Composite の親である UIObject が提供するaddStyleNameです。TabBar から特定のタブを取得してこのメソッドを使用しようとすると、Eclipse でエラー (およびコンパイル エラー) が発生します。コードはこんな感じ…
Tab myTab = tabPanel.getTabBar().getTab(3);
myTab.addStyleName("gwt-TabBarItem-selected");
しかし、UIObject にアップキャストすると動作します...
UIObject myTab = (UIObject) tabPanel.getTabBar().getTab(3);
myTab.addStyleName("gwt-TabBarItem-selected");
Eclipse はこれを認識し、より一時的なアップキャストを行うクイック フィックスの提案を提供します...
Tab myTab = tabPanel.getTabBar().getTab(3);
((UIObject) myTab).addStyleName("gwt-TabBarItem-selected");
古き良き Google を使っていて、何が起こっているのかわかりません。スーパークラスのメソッドを完全に隠すことはできないはずですよね? アップキャストに関する議論では、その主な用途はオーバーロードされたメソッドのスーパークラス バージョンを選択することだと言っているようですが、addStyleName はオーバーロードされていません。私が求めているスーパークラスを拡張する内部クラスによって実装される内部インターフェースとして、Tab が定義されている方法と関係があるとしか思えません。それで、ここで何が起こっているのですか?インターフェイス型を使用すると、実装クラスからスーパークラス メソッドにアクセスできないのはなぜですか?