2012-05-04 47 views
2

我想重新使用一個Builder實例來創建幾個控件,但我得到編譯錯誤,我不明白。我認爲他們是由我不正確地理解泛型造成的。誰能幫忙?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 

其中clickHandler事件是EventHandler<ActionEvent>

我得到的錯誤是

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

ButtonBaseBuilder實現生成器,它應該有一個build()方法,不應該嗎?另外,如果我一起運行所有內容(如按鈕2),那就OK了。

這是JDK 7.0u4和JavaFX SDK 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

ButtonBaseBuilder沒有build方法。 ButtonBuilder,其中extends ButtonBaseBuilder,有一個因爲它implements Builder<Button>

這應該工作:

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

OK,是的,我錯過了周圍第一次。建設者是在一個層次結構,只是'提示'實施建設<> –