2017-03-06 34 views
0

我具有被定義的函數,如下所示:傳方法參照方法示出了錯誤

public static <T> T readSingleValue(MyTransaction t, String s, T alternativeVal, Function<Integer, T> rsGetter) { 
    ... 
    return rsGetter.apply(1); 
} 

現在我想調用此方法是這樣的:

readSingleValue(transaction, "select count(0) from users", 0, ResultSet::getInt); 

而結果集:: getInt( )被定義爲這樣的:

int getInt(int columnIndex) 

我的編譯器顯示我的參數ResultSet::getInt以下錯誤: 非靜態方法不能從靜態上下文中引用

我在這裏做錯了什麼?

+5

你會得到'ResultSet'對象來調用'getInt'嗎? –

+0

好問題,我沒有想過這個。謝謝 – sfandler

+0

如果你有變量'ResultSet rs',你可以使用方法引用'rs :: getInt'作爲你方法的最後一個參數。 – Misha

回答

0

ResultSet::getInt是對靜態方法的引用,但方法是實例方法,這是錯誤。另一種選擇可能是:

public static <T> T readSingleValue(MyTransaction t, String s, T alternativeVal, Function<ResultSet, T> rsGetter) 

,並調用它

readSingleValue(transaction, "select count(0) from users", 0, rs -> rs.getInt(1)); 

功能Function<ResultSet, T> rsGetter是更強大,因爲它可以在ResultSet映射到可以從數據庫中的多個列組成所需的對象。例如,你可以有

readSingleValue(transaction, "select * from users where user_id = 1", null, 
     rs -> { 
      User u = new User(); 
      u.setId(rs.getInt(1)); 
      u.setName(rs.getString(2)); 
      ... 
      return u; 
     }); 
+0

你可以簡單地使用'rs :: getInt'。 – NoDataFound

+0

我認爲'resultSet'是在readSingleValue方法內部創建的,因爲他將sql字符串傳遞給方法。爲什麼傳遞sql如果你已經有了resultSet? – AlexCV