为什么我有时会使用Eclipse quickfix获取<! - ? - >通配符

时间:2015-09-03 20:25:05

标签: java eclipse generics

我正在清除Eclipse中的警告

 ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized

但我不明白为什么Eclipse会定期使用通配符<?>。大部分时间它都是正确的类型,即ArrayList<Bicycle>。但如果我在List上执行Line 1 quickfix,则会使用以下代码更改为List<?>,而如果我在ArrayList上执行quickfix,则会更改为ArrayList<Object>即使at Line 2方法调用Line 3并返回List<String>

public List getList() {
    List treq = new ArrayList();
    List deptList = new ArrayList();  // Line 1
    try {
        treq = trDao.getList(status, dept, type, site);
        deptList = trDao.getDepts();  // Line 2
    }   
    catch (DAOException e) {
        setError(FORM_RESULTS, e.getMessage());
    }
    request.setAttribute("form", this);
    request.setAttribute("deptList", deptList);
    return treq;
}

public List<String> getDepts() {      // Line 3

以下代码将trList快速修改为预期的ArrayList<RequestStudent> trList;我看到的主要区别是使用.add()

public  ArrayList getListByRequestID(String request_id) throws DAOException {
    ArrayList trList;
    Connection connection = null;

    PreparedStatement ps = null;
    ResultSet rs = null;
    String SQL_GET_LIST = SELECT_QUERY + "WHERE trs.REQUEST_ID = ? " + "ORDER BY trs.STUDENT, trs.COURSE_ID";

    try {
        connection = ds.getConnection();
        ps = connection.prepareStatement(SQL_GET_LIST);
        ps.setString(1, request_id);
        rs = ps.executeQuery();
        trList = new ArrayList();

        while (rs.next()) {
            trList.add(mapResults(rs));  //mapResults returns a RequestStudent
        }
    }


    return trList;
}

2 个答案:

答案 0 :(得分:1)

Eclipse无法猜出您实际想从该方法返回的内容。例如,这种方法是完全有效的:

public List<?> getList(int random) {
    if (random > 10) {
        return new ArrayList<String>();
    }
    else {
        return new ArrayList<Integer>();
    }
}

所以,仅仅因为

deptList = trDao.getDepts();

为deptList指定List<String>并不意味着您不希望deptList成为List<?>List<? extends Serializable>,或者List<? extends CharSequence>或与List<String>兼容的任何其他类型。

答案 1 :(得分:1)

您的getList()方法定义为返回原始List。查看方法本身,无法确定它应返回的泛型类型,因此Eclipse会建议<?><Object>尽可能(通常<?>参数和实例和<Object>用于分配和返回类型,但不要让我这样做。

new ArrayList()相当于new ArrayList<Object>(),而List deptList = ...则取决于所分配的类型。由于ArrayList是原始的,Eclipse无法知道它应该是什么类型,因此<?>也是如此。

您需要清理代码,以明确说明您正在使用的类型。 从不引用具有泛型的类型而不指定泛型类型。

假设您尝试使用StringgetList()应该是:

public List<String> getList() {                          // add <String>
    List<String> treq = new ArrayList<>();               // add <String> and <>
    List<String> deptList = new ArrayList<>();           // add <String> and <>
    try {
        treq = trDao.getList(status, dept, type, site);
        deptList = trDao.getDepts();
    }   
    catch (DAOException e) {
        setError(FORM_RESULTS, e.getMessage());
    }
    request.setAttribute("form", this);
    request.setAttribute("deptList", deptList);
    return treq;
}

getListByRequestID()的区别在于List中只插入了一种类型,因此Eclipse可以猜测您打算创建该类型的List 。在getList()中无法确定可能会在treqdeptList中插入哪些类型,因此必须回退到<Object><?>

请记住,Eclipse的建议只是建议。他们可能错了。如果您了解他们正在做什么,并且只是试图避免输入您已经计划编写的样板文件,那么您应该只使用它们。