我正在清除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;
}
答案 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无法知道它应该是什么类型,因此<?>
也是如此。
您需要清理代码,以明确说明您正在使用的类型。 从不引用具有泛型的类型而不指定泛型类型。
假设您尝试使用String
,getList()
应该是:
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()
中无法确定可能会在treq
和deptList
中插入哪些类型,因此必须回退到<Object>
或<?>
请记住,Eclipse的建议只是建议。他们可能错了。如果您了解他们正在做什么,并且只是试图避免输入您已经计划编写的样板文件,那么您应该只使用它们。