1

これは私を困惑させます:)コードは機能しているので、より精神的な課題です。GWT TabBar で個々のタブのスタイルを設定しようとしています。このウィジェットのセットアップは少し独特です。Tab クラスは、TabBar クラス内の内部インターフェイスとして定義され、TabBar 内の ClickDelegatePanel と呼ばれる内部クラスによって実装されます。TabBar の完全なコードはこちら

https://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/user/client/ui/TabBar.java

重要なビット (私が思うに!) はインターフェイスです。

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 が定義されている方法と関係があるとしか思えません。それで、ここで何が起こっているのですか?インターフェイス型を使用すると、実装クラスからスーパークラス メソッドにアクセスできないのはなぜですか?

4

1 に答える 1

3

Composite伸びませUIObject。あなたの参照はオブジェクトではなく、(これは aであり、したがって aです)。Tab インターフェイスは addStyleName を宣言していません。これは Eclipse が伝えていることです。ここでたまたまTab を UIObject に正常にキャストできますが、それは型階層によって保証されていません。UIObject ではない Tab を実装するクラスを作成できます。その場合、キャストは失敗します。 TabTabClickDelegatePanelCompositeUIObject

于 2013-03-27T22:31:55.027 に答える