有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中参数化原始类型的泛型

我使用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;

    }

本期月食报道:

enter image description here


共 (4) 个答案

  1. # 1 楼答案

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

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

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

  2. # 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
    
  3. # 3 楼答案

    尝试以下方式声明您的方法:

    public LinkedList<Object> toBeanList(ResultSet rs, Class<Object> clazz) 
    
  4. # 4 楼答案

    试试这个

    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);
    }