2017-03-06 19 views
0

ich eine Funktion haben, die wie folgt definiert ist:Passing Verfahren Bezug auf das Verfahren zeigt Fehler

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

Jetzt habe ich diese Methode wie folgt nennen wollen:

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

während ResultSet :: getInt () wird als das definiert:

int getInt(int columnIndex) 

Mein Compiler zeigt mir für den Parameter folgende Fehler ResultSet::getInt: Nicht-statische Methode kann nicht aus einem statischen Kontext referenziert werden

Was mache ich hier falsch?

+5

10 haben. Woher würden Sie das 'ResultSet'-Objekt erhalten, um' getInt' aufzurufen? –

+0

Gute Frage, ich habe nicht darüber nachgedacht. Danke – sfandler

+0

Wenn Sie die Variable 'ResultSet rs' haben, können Sie den Methodenverweis' rs :: getInt' als letzten Parameter Ihrer Methode verwenden. – Misha

Antwort

0

ResultSet::getInt ist eine Referenz auf eine statische Methode, aber die Methode ist eine Instanzmethode, das ist der Fehler. Eine weitere Option könnte sein:

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

und nennt es

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

Die Funktion Function<ResultSet, T> rsGetter mächtiger ist, weil es ein ResultSet auf das gewünschte Objekt abbilden kann, die aus mehreren Spalten aus der Datenbank zusammengesetzt werden können. Sie könnten beispielsweise

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

Sie können einfach 'rs :: getInt' verwenden. – NoDataFound

+0

Ich denke, das 'resultSet' wird in der Methode' readSingleValue' erzeugt, weil er die sql-Zeichenfolge an die Methode übergibt. Warum übergeben Sie die SQL, wenn Sie bereits die Ergebnismenge haben? – AlexCV