具有可变类型的使用者的功能接口

时间:2019-03-04 19:17:09

标签: java anonymous-types consumer functional-interface

我正在编写一个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上搜索了此站点,但找不到任何示例。

0 个答案:

没有答案