Java方法接受不同的功能接口类型 - 可能吗?
首先,很抱歉标题不好,但我发现用一个简短的句子来总结我的问题有点困难......
我们的软件中有一些代码我非常不满意。它是这样的:
@FunctionalInterface
public interface OneArgCall<T, U, A> {
T execute(U u, A arg);
}
@FunctionalInterface
public interface TwoArgCall<T, U, A, B> {
T execute(U u, A arg, B arg2);
}
public <T, U, A, B> T execCall(String x, Class<U> c, OneArgCall<T, U, A> call, A arg) {
U u = doSomething(x, c);
try {
return call.execute(u, arg);
} catch (SomeException se) {
handleSe(se);
} catch (SomeOtherException soe) {
handleSoe(soe);
}
public <T, U, A, B> T execCall(String x, Class<P> c, TwoArgCall<T, U, A, B> call, A arg, B arg2) {
U u = doSomething(x, c);
try {
return call.execute(u, arg, arg2);
} catch (SomeException se) {
handleSe(se);
} catch (SomeOtherException soe) {
handleSoe(soe);
}
即,除了作为第三个参数传递的功能接口(当然还有该接口的参数列表)之外,execCall方法是相同的。现在,我仍然可以忍受这一点,但是还有更多这样的方法(想象一下ThreeArgCall,FourArgCall...) - 这就是它变得难以忍受的地方。
所以,以所有干燥的名义:你会如何清理这个代码?我想象一些东西,比如某样东西可以是OneArgCall,TwoArgCall中的任何一个......接口和SOMETHING_ELSE表示参数的列表(?)。T execCall(String x, Class<U> c, SOMETHING, SOMETHING_ELSE)
这完全可以做到吗?或者有没有其他方法可以重构此代码以减少重复性?