我正在编写一个Spring RowMapper,我有一个switch语句来检查每个列标签。当标签匹配时,我得到值并将其设置在返回对象中。
如果该列中的值为空,则我不想在返回对象中初始化或设置该值。
我创建了一些辅助函数,以一次完成所有操作:
@FunctionalInterface
interface CallSetter<P1, P2, C1, R>
{
public R exec(ResultSet rs, String columnLabel, Consumer<R> setter) throws SQLException;
}
当我按以下方式定义我的不同类型时,这很好用(一个示例):
CallSetter<ResultSet, String, Consumer<String>, String> setStr = (rs, columnLabel, setter) ->
{
String val = rs.getString( columnLabel );
Boolean result = rs.wasNull();
if( result == false )
setter.accept( val );
return val;
};
但是,我真的希望我的Consumer在功能接口中是匿名的,但是然后在我的定义中定义类型,因为我希望所有setX方法都返回Boolean而不是值。换句话说,我希望Consumer在实现接口时能够定义类型,以便可以拥有setStr,setDouble等。
当我尝试执行此操作时(我现在正在学习Java 8,因此我不知道这是否是我要执行的操作的正确语法):
@FunctionalInterface
interface CallSetter<P1, P2, C1, R>
{
public R exec(ResultSet rs, String columnLabel, Consumer<?> setter) throws SQLException;
}
然后这样定义我的函数:
CallSetter<ResultSet, String, Consumer<String>, String> setStr = (rs, columnLabel, setter) ->
{
String val = rs.getString( columnLabel );
Boolean setVal = rs.wasNull() == false;
if( setVal )
setter.accept( val );
return setVal;
};
编译器给我一个错误:
类型Consumer的方法accept(?的捕获#1) 不适用于参数(字符串)。
似乎我被迫使用我的任何参数的相同类型之一或返回类型(如果我输入Consumer<R>
可以正常工作,但每次都必须返回值)。 / p>
我已经在Internet上搜索了此站点,但找不到任何示例。