2017-01-08 25 views
0

我有以下代碼:無法從java.lang.Integer中轉換至R

class inner { 
    Integer i; 
    public Integer getValue() { 
     return i; 
    } 
    public void setValue(Integer i) { 
     this.i = i; 
    } 
} 

class outer { 
    public static inner i1; 

    outer(Integer i) { 
     i1.setValue(i); 
    } 
} 

public class MyClass{ 
public void main() { 
    List<Integer> ll = Arrays.asList(new outer(2)).stream().map(outer.i1::getValue).collect(Collectors.toList()); 

} 

我得到以下錯誤:

required: Function<? super Object,? extends R> 
    found: outer.i1::getValue 
    reason: cannot infer type-variable(s) R 
    (argument mismatch; invalid method reference 
     method getValue in class inner cannot be applied to given types 
     required: no arguments 
     found: Object 
     reason: actual and formal argument lists differ in length) 
    where R,T are type-variables: 
    R extends Object declared in method <R>map(Function<? super T,? extends R>) 

我是新來的流,並讀取文檔沒有按爲我清除這件事。任何幫助將不勝感激。

+2

你的代碼很奇怪。你爲什麼使用構造函數來修改靜態值?你爲什麼試圖將'outer'的實例映射到'inner'的靜態實例?你期望它產生什麼? – shmosel

+0

@shmosel這只是我爲了解流API的工作而編寫的測試代碼。 – goelakash

回答

3

getValue是一種不帶參數的方法。 當您嘗試通過的getValueStream的方法引用的map方法,你正試圖將Stream傳遞的元素getValue,但getValue不帶任何參數。

,如果你希望忽略了數據流的outer元素,您可以替換lambda表達式的方法參考:

List<Integer> ll = Arrays.asList(new outer(2)).stream().map(o -> outer.i1.getValue()).collect(Collectors.toList()); 

然而,這會導致NullPointerException,因爲你不初始化public static inner i1任何地方,因此調用outer構造函數將拋出該異常。

很難建議如何解決這個問題,而不知道你在做什麼。

我不知道在outer類中有一個類型爲inner的靜態成員是否有意義,但是如果它合理,您應該在靜態初始化塊(或其聲明中)初始化它。

你可以,例如,更改

public static inner i1; 

public static inner i1 = new inner(); 

這將消除異常。

+0

我想我明白了。如果傳遞給map的方法引用適用於流的對象類型,則將其應用於該對象。但是,在這種情況下,您可以傳遞將流對象作爲參數的方法引用。我在這裏解釋它:http://stackoverflow.com/questions/41532611/java-8-streams-map-api-interpretation-of-method-reference – goelakash

相關問題