Java泛型返回值:双重转换

时间:2017-06-28 21:57:24

标签: java generics casting

我是Java的新手,特别是编写通用代码。我的任务是编写泛型函数,它将返回ResultSet对象的ID列的值。

父类有整数ID,子类有字符串ID(我知道有字符串ID,但数据非常具体)

所以在父类中我最终得到了函数:

public <T> T getRowId(ResultSet rs) throws SQLException {
   return (T)((Long)rs.getLong(idCol));
}

并且在子类中我有一个覆盖父级的方法:

public <T> T getRowId(ResultSet rs) throws SQLException {
   return (T)(rs.getString(idCol));
}

当我需要调用此函数时,我只是这样做:

getRowId(rs)

我的问题是,如果进行双重投射(T)((Long)...)是好的吗?是否有更简单的方法来实现我不知道的这个功能?

1 个答案:

答案 0 :(得分:0)

正如评论所说,如果您确切知道自己获得了TLong,那么投放到String是没有意义的。

您可以采取以下两种方法:

方法1:

@SuppressWarnings("unchecked")
public static <T> T getRowId(ResultSet rs) throws SQLException {
    return (T)rs.getObject(1);
}

方法2:

public interface RowMapper<T>{
    public T getRowId(ResultSet rs) throws SQLException;
}

public class ParentRowMapper implements RowMapper<Long>{

    public Long getRowId(ResultSet rs) throws SQLException {
        return rs.getLong(1);
     }
}

public class ChildRowMapper implements RowMapper<String>{

    public String getRowId(ResultSet rs) throws SQLException {
        return rs.getString(1);
     }
}