gpt4 book ai didi

java - 使用 Java 泛型和 Java 8 lambda 传递带有 Callable 的 void 方法

转载 作者:搜寻专家 更新时间:2023-11-01 01:41:04 25 4
gpt4 key购买 nike

我正在尝试编写一个通用的性能日志记录函数,我可以将任何要计时的方法传递给它,它会将执行时间记录到我的数据库中。我在大多数情况下都能正常工作,但是在传递返回 void 的方法时我会遇到编译器错误:

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

这是我的类(class):

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");

此功能是否可以在 void 方法上运行,还是我运气不好?

最佳答案

Callable 必须有一个返回值。在这种情况下,您可以简单地返回 null,但您需要一个 block lambda:

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");

关于java - 使用 Java 泛型和 Java 8 lambda 传递带有 Callable 的 void 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39298772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com