2017-03-06 41 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