2016-09-02 2 views
4

Я пытаюсь написать общую функцию ведения журнала производительности, в которой я могу передать любой метод, на который нужно выполнить синхронизацию, и он будет записывать время выполнения в мою базу данных. У меня это работает в большинстве случаев, но я получаю ошибку компиляции при переходе метода, который возвращает void:Передача метода void с помощью Callable с использованием Java-дженериков и Java 8 lambda

no instance(s) of type variable(s) T exist so that void conforms to T 

Вот мой класс:

public class Performance { 
    public static <T> T measureExecTime(Callable<T> c, String gid, String name) { 
     T call = null; 
     try { 
      if (Constants.DEBUG) { 
       Calendar start = Calendar.getInstance(); 
       call = c.call(); 
       Calendar end = Calendar.getInstance(); 
       long diff = end.getTimeInMillis() - start.getTimeInMillis(); 
       // log diff to database 
      } else { 
       call = c.call(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return call; 
    } 
} 

А вот как я называю это:

Performance.measureExecTime(() -> myMethod(myMethodParam1, myMethodParam2), "gid", "database_qualifier"); 

Возможно ли, что эта функциональность ведет себя по методам пустоты, или мне не повезло?

ответ

7

Callable должно иметь возвращаемое значение. В этом случае вы можете просто вернуть нулевой, но вам нужен блок лямбда:

Performance.measureExecTime(() -> { 
    myMethod(myMethodParam1, myMethodParam2); 
    return null; 
}, "gid", "database_qualifier"); 

Если вы хотите, вы можете создать вспомогательный метод, чтобы сделать вещи немного очистителя:

static Callable<?> wrap(Runnable r) { 
    return() -> { 
     r.run(); 
     return null; 
    }; 
} 
// ... 
Performance.measureExecTime(wrap(() -> myMethod(myMethodParam1, myMethodParam2)), "gid", "database_qualifier"); 
0

вызываемых объектов нужно вернуть значение.

void говорит: он не возвращает значение.

Таким образом, вероятность того, что эти две конфликтующие цели будут решены, вряд ли удастся!