2012-05-04 13 views
2

ビルダーインスタンスを再利用していくつかのコントロールを作成したいが、わかりにくいコンパイルエラーが出ている。ジェネリック医薬品を正しく理解していない私が原因だと思う。誰も助けることができますか? clickHandlerはEventHandler<ActionEvent>JavaFXビルダー/ Javaジェネリック

ある

ButtonBuilder builder = ButtonBuilder.create().minHeight(40.0).minWidth(40.0); 
Button button1 = builder.onAction(clickHandler).build(); // Error 
Button button2 = ButtonBuilder.create().minHeight(40.0).minWidth(40.0).onAction(clickHandler).build(); //OK 

私が手にエラーが

error: cannot find symbol 
    Button button1 = builder.onAction(clickHandler).build(); 
               ^
symbol: method build() 
location: class ButtonBaseBuilder 

それは、ビルド()メソッドを持っている必要がありますのでButtonBaseBuilderはそれではないはず、ビルダーを実装しているのですか?また、(button2のように)すべてを一緒に実行するとOKです。

これは事前に2.1

おかげで、 ピート

答えて

2

をあなたがそのようビルダーを使用することを渡すButtonBuilderジェネリックパラメータする必要があります。

ButtonBuilder<? extends ButtonBuilder> builder = 
        ButtonBuilder.create().minHeight(40.0).minWidth(40.0); 
    Button button1 = builder.onAction(clickHandler).build(); 
+1

ありがとう!分かったと思います; ButtonBuilderのタイプにジェネリックパラメータを追加すると、コンパイラはそのタイプを(推論によって) '覚えている'ように指示します。それがなければ、XXXBuilderメソッドはButtonBuilderのスーパークラスである独自の型を返します。 –

+0

うん、そうだよ! –

2

ButtonBaseBuilderbuildメソッドを持っていないJDKの7.0u4とのJavaFX SDKにあります。 ButtonBuilderextends ButtonBaseBuilderには、implements Builder<Button>というものが1つあります。

これは動作するはずです:

Button button1 = ((ButtonBuilder) builder.onAction(clickHandler)).build(); 
+0

OK、はい、私は周りにその最初の時間を逃しました。ビルダーは階層構造になっており、ヒントだけがビルドされています。<> –