2011-05-09 68 views
1

我想使用此代碼來擴展java.awt.image.BufferedImageJava - 不能擴展類?

import java.awt.image.BufferedImage; 

public class FSImage extends BufferedImage { 

    public FSImage() { 
     // empty constructor 
    } 
} 

不過,我得到了一些錯誤:

no suitable constructor found for BufferedImage() 
constructor java.awt.image.BufferedImage.BufferedImage(java.awt.image.ColorModel, java.awt.image.WritableRaster, boolean, java.util.Hashtable<?,?>) is not applicable (actual and formal argument lists differ in length) 
... 

我在做什麼錯?

回答

9

「空構造函數」隱式調用nullary基類構造函數,BufferedImage中不存在這樣的構造函數。您需要明確調用相應的基類構造函數:

public FSImage() { 
    super(args); // replace "args" with actual arguments to BufferedImage() 
    // other stuff 
} 
1

BufferedImage沒有空構造函數。擴展它時,派生類將需要在其超類中調用特定的構造函數(BufferedImage)。

0

因爲BufferedImage沒有任何參數構造函數。

1

您必須實現該類的現有構造的一個或多個有在BufferedImage沒有定義默認構造函數,所以你不能這樣做

new BufferedImage(); 

類似的方式,如果你創建了BufferedImage的子類,它就不能與它的超級類接口,而不滿足初始化要求。所以,子類構造函數必須調用至少一個超類構造函數。

你可以試試這個..

public FSImage(int arg0, int arg1, int arg2) { 
    super(arg0, arg1, arg2); 

} 

public FSImage() { 
    super(100, 100, BufferedImage.TYPE_INT_ARGB); 

} 
3

當擴展一個類,子類必須最終調用父類的構造函數中的一些(無論是直接還是通過其定義其他構造函數鏈最終調用超類的構造函數)。如何獲取參數通常是通過實現具有相同參數的構造函數,然後將其傳遞給super來完成的。

BufferedImage(int width, int height, int imageType) 

是BufferedImage()的構造函數之一。既然你在擴展它,你可以提供這個構造函數。

FSImage(int width, int height, int imageType) 

然後調用super()的調用父類的構造函數:

FSImage(int width, int height, int imageType) { 
    super(width, height, imageType); 
} 

然而,應該指出的是,只要您撥打一個有效的超()構造函數,你自己的構造不必具有相同的簽名。例如,下面的是一個合法的構造:

FSImage() { 
    super(100, 100, TYPE_INT_RGB); 
} 

如果不定義任何構造函數,編譯器會默認調用父類的無參數,默認構造函數。由於在這種情況下,它不存在,您必須調用現有的構造函數。

+0

「擴展類時,還必須實現超類具有的構造函數。」這顯然是錯誤的。只是測試它。 – 2011-05-09 15:40:03

+0

是的,你是對的。正確地說,子類最終必須調用超類的某個構造函數(不管是直接還是通過它定義的最終調用超類的構造函數的其他構造函數進行鏈接)。如何獲取參數通常是通過實現具有相同參數的構造函數,然後將其傳遞給super來完成的。 – 2011-05-09 15:47:25

+0

同意。也許你應該相應地編輯你的答案。 – 2011-05-09 16:36:34

0

的BufferedImage沒有你需要有一個超級無參數的構造函數構造函數中的()調用相應參數(需要圖像的大小以及圖像的內部存儲類型)