2014-12-02 314 views
4

我正在做一個項目,我必須否定PPM文件(圖像)的像素。推斷的類型不符合上限

我實現了我否定的功能,例如:

public PPMImage negate() 
{ 
    RGB[] negated = new RGB[pixels.length]; 
    System.arraycopy(pixels, 0, negated, 0, pixels.length); 
    RGB[] negatedArr = Arrays.stream(negated).parallel().map(rgb -> rgb.neg(maxColorVal)).toArray(size -> new RGB[size]); 
    return new PPMImage(width, height, maxColorVal, negatedArr); 
} 

隨着neg(maxColorVal)功能被定義爲這樣的:

public void neg(int maxColorVal) 
{ 
    R = maxColorVal - R; 
    G = maxColorVal - G; 
    B = maxColorVal - B; 
} 

當我編譯的代碼,我收到以下錯誤:

error: incompatible types: inferred type does not conform to upper bound(s) 
RGB[] negatedArr = Arrays.stream(negated).parallel().map(rgb -> rgb.neg(maxColorVal)).toArray(size -> new RGB[size]); 

inferred: void 
upper bound(s): Object 

map()函數的錯誤點。我做錯了什麼?

+0

另外添加,RGB是包含的R值,G值,和B值,其中相結合,使一個顏色對象。此外,像素數組是PPMImage類的保護變量,它是給我的。 – 2014-12-02 09:38:16

+1

如果'RGB'是可變的,就像你的'neg'方法所暗示的那樣,沒有必要一直拷貝數組(這樣做會產生一個危險的錯誤印象)。在完成您的操作後,所有三個數組,像素,negated和negatedArr都包含相同的修改值。如果你使用可變的'RGB'值實現,一個簡單的'Arrays.stream(pixels).parallel()。forEach(rgb - > rgb.neg(maxColorVal))'將完成整個工作(並且與原始'void neg'方法也是如此)。如果您不想修改原始數組,則必須克隆值實例。 – Holger 2014-12-02 10:10:15

回答

1

更正:

map函數要求返回一些引用類型的方法,但negvoid返回類型。

嘗試更改neg方法:

public RGB neg(int maxColorVal) { 
    R = maxColorVal - R; 
    G = maxColorVal - G; 
    B = maxColorVal - B; 
    return this; 
} 
+0

我做了更改,但錯誤仍然相同@Eran – 2014-12-02 09:43:09

+0

@JeffreyTai我編輯了我的答案。你有沒有看到更新的答案? – Eran 2014-12-02 09:43:56

+0

非常感謝你!這工作。 @Eran – 2014-12-02 09:45:12