在Java中参数化原始类型

时间:2013-11-27 09:55:12

标签: java generics

我使用Eclipse IDe和Apache Commons DBUtils库,我有一些从BasicRowProcessor class扩展的行处理器类。在这个类中,我重写了这两个DButils的方法:

public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException

public <T> List<T> toBeanList(ResultSet rs, Class<T> type) throws SQLException

我对toBeanList方法的实现如下:

   @Override
    public LinkedList<Object> toBeanList(ResultSet rs, Class clazz) {
        try {
            LinkedList<Object> newlist = new LinkedList<Object>();
            while (rs.next()) {
                newlist.add(toBean(rs, clazz));
            }
            return newlist;
        } catch (SQLException ex) {
            throw new RuntimeException(ex);
        }
    }

我遍历ResultSet并调用toBean方法获取所有记录。它有效,但Eclipse报告了一些问题(可能与Java泛型有关),请看这个截图:

enter image description here

当我将clazz参数设置为Class<TaskItem> clazz时,Eclipse会报告另一个问题,并且它不会覆盖上层BasicRowProcessor中的方法。

enter image description here

我该如何解决这个问题?我究竟做错了什么?或者忽略此警告是否安全?可能很容易解决这个问题,但我还没有找到解决方案。

修改:

我试图对我的两个方法进行参数化,但Eclipse报告我需要覆盖超类型。

toBeanList方法:

@Override
    public LinkedList<TaskItem> toBeanList(ResultSet rs, Class<TaskItem> clazz) {
        try {
            LinkedList<TaskItem> newlist = new LinkedList<TaskItem>();
            while (rs.next()) {
                newlist.add(toBean(rs, clazz));
            }
            return newlist;
        } catch (SQLException ex) {
            throw new RuntimeException(ex);
        }
    }

toBean方法:

@Override
    public TaskItem toBean(ResultSet rs, Class<TaskItem> clazz) throws SQLException {

        TaskItem item = new TaskItem();
     // some stuff....       
        return item;

    }

这个Eclipse报道:

enter image description here

5 个答案:

答案 0 :(得分:2)

您使用

public <T> List<T> toBeanList(ResultSet rs, Class<T> type) throws SQLException

该类型的占位符为T。这意味着结果列表是T的列表,作为参数传递的类是Class<T>。因此,当您需要LinkedList<Object>时,需要将Class<Object>传递给方法。

如果您想传递Class<TaskItem>,则会获得LinkedList<TaskItem>。因此它将是

public List<TaskItem> toBeanList(ResultSet rs, Class<TaskItem> type) throws SQLException

答案 1 :(得分:0)

尝试以这种方式声明您的方法:

public LinkedList<Object> toBeanList(ResultSet rs, Class<Object> clazz) 

答案 2 :(得分:0)

该声明中的T是一个类型变量,它必须在您使用它的任何地方保持一致。在这种情况下,方法(以及类中的其他位置,例如on T)上的所有toBean必须匹配。拥有类变量的目的是告诉Java你从ResultSet中提取了什么类型的对象,所以你需要像这样声明你的方法:

public LinkedList<TaskItem> toBeanList(ResultSet rs, Class<TaskItem> class)

请注意,在这种情况下,如果您已经知道您正在使用TaskItem,则无需将其传递给toBeanList,除非您覆盖的方法需要它。

答案 3 :(得分:0)

如方法定义中所述:

public <T> List<T> toBeanList(ResultSet rs, Class<T> type) throws SQLException

Class的'T'应该与List的T相同。

所以你的方法定义应该是:

public List<TaskItem> toBeanList(ResultSet rs, Class<TaskItem> type) throws SQLException{
//Code
}

这是你的方法看起来的样子吗?

答案 4 :(得分:0)

试试这个。

toBeanList 方法

@Override
public <T> List<T> toBeanList(ResultSet rs, Class<T> type) throws SQLException {
    List<T> list = new ArrayList<T>();
    while (rs.next()) {
        list.add(toBean(rs, type));
    }
    return list;
}

toBean 方法

@Override
public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException {
    TaskItem item = new TaskItem();

    //populate item ...

    return type.cast(item);
}