我定义了以下接口:
interface WorkValidator {
<T> T checkWork (Worker<T> worker);
interface Worker<T> {
T doWork();
}
}
最简单的实现如下:
class MyWorkValidator implements WorkValidator {
<T> T checkWork (Worker<T>) {
return worker.doWork();
}
}
. . .
MyWorkValidator myValidator = new MyWorkValidator();
. . .
SomeType finishedWork = myValidator.checkWork( () -> someWorker.work(p1, p2, etc) );
当无论 lambda 正在做什么,都需要在
checkWork()
中应用相同的逻辑时,这一切都很好。但是,我需要根据 lambda 将返回的内容采取不同的操作(包括不调用 lambda)。
我已经尝试了所有我能想到的方法来获取参数化类型背后的实际类型
T
但一直画空白。有人可以帮我吗?
这是我尝试过的一些事情
Class<?> wclass = worker.getClass();
Method method = wclass.getMethod("doWork", new Class<?>[]{});
// rtype.getName() always returns "java.lang.Object"
Class<?> rtype = method.getReturnType();
Type gtype = method.getGenericReturnType();
// gtclass.getName() always returns "java.lang.Class"
Class<?> gtclass = gtype.getClass();
// this always returns "java.lang.Object"
String gtname = gtype.getTypeName());
值得注意的是,
WorkValidator
接口和调用其实例的代码位于不同的库中,无法更改。我认为这意味着我不能在 Jackson 中使用 com.google.gson.reflect.TypeToken
或类似的技巧。
这将编译并调用适当的方法。
MyWorkValidator
实现 WorkValidator
。MyWorkValidato
r 创建 Some 类的实例并调用 checkWork
。interface WorkValidator {
<T> T checkWork (Worker<T> worker);
interface Worker<T> {
T doWork();
}
}
class SomeClass implements WorkValidator.Worker<Integer>{
public Integer doWork() {
System.out.println("Do work prints 20 and returns 20");
return 20;
}
}
public class MyWorkValidator implements WorkValidator {
public static void main(String[] args) {
MyWorkValidator mwv = new MyWorkValidator();
int v = mwv.checkWork(new SomeClass());
System.out.println("CheckWork Prints returned value of " + v);
}
public <T> T checkWork (Worker<T> worker) {
return worker.doWork();
}
}
打印
Do work prints 20 and returns 20
CheckWork Prints returned value of 20